トップページ > 記事閲覧
ループ時の処理負荷軽減方法
名前:チップ 日時: 2015/02/15 08:24

いつもお世話になっております。 質問させてください。 リフレッシュレートの値に左右されずに1/60で動作させるために サンプルにもある下記の方法で秒間60フレームを実装しているのですが、 //--------------------------------------------------------------------------- // 裏画面の内容を表画面に反映させる ScreenFlip() ; // 17ミリ秒(約秒間60フレームだった時の1フレームあたりの経過時間) // 経過するまでここで待つ while( GetNowCount() - Time < 17 ){} //--------------------------------------------------------------------------- CPUの占有率を見ると while( GetNowCount() - Time < 17 ){} で待っているところで処理時間を莫大に食ってしまうようです。 なるべく処理負荷をかけずにこの部分を実装する方法はございますでしょうか。 何卒宜しくお願いします。
メンテ

Page: 1 | 2 |

Re: ループ時の処理負荷軽減方法 ( No.20 )
名前:管理人 日時:2015/02/16 00:06

もうお話が終了していますが一応 私の場合は ScreenFlip や WaitVSync を使ってモニタのリフレッシュレートをチェックして、 ゲームのフレームレートとリフレッシュレートが一致している場合はタイマーによる待ちは行わずに ScreenFlip の待ちに任せ、ゲームのフレームレートとリフレッシュレートが異なる場合は VSync待ちをOFFにしてタイマーによる待ちを行うようにしています
メンテ
Re: ループ時の処理負荷軽減方法 ( No.21 )
名前:チップ 日時:2015/02/16 19:43

すみません。せっかくなので管理人様の方法で試してみたのですが、 下記のルーチンでリフレッシュレートを計算して結果により SetWaitVSyncFlag( FALSE ) をコールするようにしたのですが、 これを DxLib_Init() の後に入れると正常に動作するのですが DxLib_Init() の前に入れると立ち上げで失敗してしまします(ウィンドウも開きません)。 WaitVSync()(もしくはScreenFlip() )を DxLib_Init() の前に呼ぶことで不具合が起きるようです。 しかしながら SetWaitVSyncFlag( FALSE ) はDxLib_Init() の前によばなければ効力が出ないので いかんともしがたい状況です。 ScreenFlipCount = 0 ; tmp_time = GetNowCount() ; // 計測開始時刻を保存 while(1) // 1秒間に実行できる ScreenFlip の回数を計測 { WaitVSync(1); // もしくは ScreenFlip() if( GetNowCount() - tmp_time >= 1000 ) break ; // 計測開始から1秒経過していたらループから抜ける ScreenFlipCount ++ ; // ScreenFlip を実行した回数をインクリメント } if(ScreenFlipCount!=60){ SetWaitVSyncFlag( FALSE ) ; // ScreenFlip関数 実行時にCRTの垂直同期信号待ちをしない } 何か対処方法はありますでしょうか?
メンテ
Re: ループ時の処理負荷軽減方法 ( No.22 )
名前:Nameless 日時:2015/02/17 18:06

GetNowCountはDxLib_Init前に呼ぶと-1を返すので、 > if( GetNowCount() - tmp_time >= 1000 ) break ; が成立することはなく、無限ループになってしまいます。 おそらくこれが原因です。 また、リフレッシュレートを取得するだけならGetRefreshRateという関数があります。 こちらなら誤差も出ることもないのでこちらを使ってはどうでしょう。 こちらもDxLib_Init前に呼ぶと-1を返すようなのでDxLib_Init後に呼ぶ必要がありますが。
メンテ
Re: ループ時の処理負荷軽減方法 ( No.23 )
名前:チップ 日時:2015/02/17 18:08

Nameless さん 情報ありがとうございます。大変助かりました。
メンテ
Re: ループ時の処理負荷軽減方法 ( No.24 )
名前:チップ 日時:2015/02/18 00:36

最終的な結論として DxLib_Init 前にリフレッシュレートをプログラム内で確認する方法ってないんでしょうか・・・。 SetWaitVSyncFlag() が DxLib_Init の前にコールしなければならないのに DxLib_Init の前にリフレッシュレートの確認方方がないのは厳しいですね。
メンテ
Re: ループ時の処理負荷軽減方法 ( No.25 )
名前:管理人 日時:2015/02/18 01:58

すみません、現在のバージョンでは DxLib_Init 呼出し後に VSync 待ちの有無を変更できないことを失念していました DxLib_Init 呼び出し前でも GetRefreshRate を使用できるようにしてみましたので、よろしければお使いください m(_ _)m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: ループ時の処理負荷軽減方法 ( No.26 )
名前:チップ(解決) 日時:2015/02/18 07:08

お忙しい中ご対応ありがとうございます! 助かりました!
メンテ
Re: ループ時の処理負荷軽減方法 ( No.27 )
名前:チップ 日時:2015/02/18 08:02

たびたびすみません。 DxCompileConfig.hを触りたかったのでソースからコンパイルして組み込んだところ 以下のエラーが出てしましました。 エラー 1 error LNK2001: 外部シンボル ""unsigned long __cdecl DxLib::GetColor(int,int,int)" (?GetColor@DxLib@@YAKHHH@Z)" は未解決です。 エラー 2 error LNK2001: 外部シンボル ""int __cdecl DxLib::DrawBox(int,int,int,int,int,int)" (?DrawBox@DxLib@@YAHHHHHHH@Z)" は未解決です。 再コンパイルしたDxLib.libの差し替えだけでは問題ありますでしょうか?
メンテ
Re: ループ時の処理負荷軽減方法 ( No.28 )
名前:管理人 日時:2015/02/19 01:20

はい、問題あります No.25 のバージョンは DxLib.h なども変更されていますので、DxLib.lib のみ独自にコンパイル したものに差し替えても正常にビルドできません 既にお使いのDXライブラリのファイル群に No.25 バ−ジョンのファイルを上書きした後、 独自にコンパイルした DxLib.lib と、内容を変更した DxCompileConfig.h を上書きすれば 正常にビルドできますので、よろしければお試しください
メンテ
Re: ループ時の処理負荷軽減方法 ( No.29 )
名前:チップ(解決) 日時:2015/02/19 06:49

無事コンパイル通りました。 動作も問題なく DxLib_Init 呼び出し前にGetRefreshRate を使用できることをこちらの環境でも確認しました。 ご丁寧な対応本当にありがとうございました!
メンテ
Re: ループ時の処理負荷軽減方法 ( No.30 )
名前:チップ 日時:2015/02/19 19:44

何度もすみません。 修正して頂いたバージョンのライブラリだと一旦ウィンドウズモードで立ち上げた後に ChangeWindowMode( FALSE ); でフルスクリーンモードに切り替えようとするとハングして終了してしまうようです。
メンテ
Re: ループ時の処理負荷軽減方法 ( No.31 )
名前:管理人 日時:2015/02/21 02:04

すみません、手元でもハングを確認しました 修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: ループ時の処理負荷軽減方法 ( No.32 )
名前:チップ 日時:2015/02/21 06:26

すみません。 新しいバージョンをソースからコンパイル直して実行したのですがやはりフルスクリーンに切り替えるところでハング>終了するようです。 最初からフルスクリーンで立ち上げれば問題なく、 フルスクリーンで立ち上げた後にウィンドウズモードに切り替えるのも問題ありません。 ウィンドウズモードで立ち上げてからフルスクリーンモードに切り替える際のみ不具合が出るようです。
メンテ
Re: ループ時の処理負荷軽減方法 ( No.33 )
名前:管理人 日時:2015/02/21 20:49

お試しいただきありがとうございます、駄目でしたか・・・ 何処でハングしてしまっているのかを確認したいと思いますので、申し訳ありませんが よろしければこちらの出力するログを増やしたバージョンで実行して、実行時に作成される Log.txt の内容を掲示板に貼り付けて頂けないでしょうか? m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい) あと、こちらに私の環境でハングしないことが確認できている 「ウインドウモードで起動→起動4秒後にフルスクリーンに変更」 という以下のプログラムをコンパイルした実行ファイルをアップしましたので、 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 ChangeWindowMode( TRUE ) ; // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; DrawBox( 0, 0, 256, 256, GetColor( 255,255,0 ), TRUE ) ; WaitTimer( 4000 ) ; ChangeWindowMode( FALSE ) ; DrawBox( 0, 0, 256, 256, GetColor( 0,255,0 ), TRUE ) ; WaitTimer( 4000 ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } こちらもチップさんの環境ではハングしてしまうか、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/ChangeWindowModeTest.zip
メンテ
Re: ループ時の処理負荷軽減方法 ( No.34 )
名前:チップ 日時:2015/02/22 07:41

お手数おかけします。 管理人さんにご提示頂いたソースをこちらび環境で コンパイルしたところ問題なく動作しました。 私のプログラムとの差異を調べて以下のソースにしたところ フルスクリーンに切り替え時にやはりハングしました。 こちらで出力したログファイルも添付致します。 よろしくお願い致します。 int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow ) { // ウインドウモードで起動 SetMainWindowText( "test" ) ; // ウィンドウバーのタイトル SetWindowStyleMode(7); // ウィンドウズ最大化ボタンON SetWindowIconID( IDI_ICON2 ); // ウィンドウバーのアイコン SetFullScreenResolutionMode(DX_FSRESOLUTIONMODE_DESKTOP); // フルスクリーンモードを画面に合わせて拡大モードにする ChangeWindowMode( TRUE ) ; // ウィンドウモードで起動 SetGraphMode( 640 , 480 , 32 ) ; // 画面モードの変更(32ビットモードで起動) SetWindowSizeChangeEnableFlag( TRUE ) ; // 画面サイズを任意に変更可能 // DXライブラリの初期化 if( DxLib_Init() < 0 ) return -1 ; DrawBox( 0, 0, 256, 256, GetColor( 255,255,0 ), TRUE ) ; WaitTimer( 4000 ) ; ChangeWindowMode( FALSE ) ; DrawBox( 0, 0, 256, 256, GetColor( 0,255,0 ), TRUE ) ; WaitTimer( 4000 ) ; // DXライブラリの後始末 DxLib_End() ; // ソフトの終了 return 0 ; } 1:システムの情報を出力します 1: DXライブラリ Ver3.13e 2: 論理プロセッサの数 : 8 2: OS Windows7 ( Build 7601 Service Pack 1 ) 103: 現時点のCPU動作速度:大体2.18GHz 104: MMX命令を使用します 104: SSE命令が使用可能です 105: SSE2命令が使用可能です 105: CPUベンダ:GenuineIntel 106: CPU名: Intel(R) Core(TM) i7-2670QM CPU @ 2.20GHz 107:COMの初期化... 成功しました 110:メモリ総量:8098.07MB 空きメモリ領域:5726.90MB 110:タイマーの精度を検査します 111:精度結果 更新回数 マルチメディアタイマー:0 パフォーマンスカウンター:60 111: パフォーマンスカウンターを使用します タイマー精度 : 2143.583000 KHz 111: ソフトの二重起動検査... 二重起動はされていませんでした 113:ウインドウクラスを登録します... 登録に成功しました 113:ウインドウモード起動用のウインドウを作成します 143:ウインドウの作成に成功しました 144:ウインドウを表示します 182:IMEを無効にしました 183:ウインドウスタイルをウインドウモード用に変更します... 完了 205:DirectInput関係初期化処理 206: XInput DLL の読み込み中... 成功 211: DirectInput7 の取得中... 成功 222: 引き続き初期化処理... 初期化成功 225: ジョイパッドの初期化... 228: ジョイパッドの初期化は正常に終了しました 228: マウスデバイスの初期化... 初期化成功 229: キーボードデバイスの初期化... 初期化成功 230:DirectInput 関連の初期化は正常に終了しました 231:DirectSound の初期化を行います 232:DirectSound インターフェースの取得を行います.... 成功 235:引き続きインターフェースの初期化処理... 成功 308: DirectSound デバイスを列挙します 309: モジュール名: ドライバ記述:プライマリ サウンド ドライバー 309: モジュール名:{0.0.0.00000000}.{279bee1e-f6b0-4e57-9f90-5347334a32ac} ドライバ記述:スピーカー (VIA High Definition Audio) 310: 最大サンプリングレート:200.00KHz 最小サンプリングレート:0.10KHz 310: 総サウンドメモリ領域:0.00KB 空きサウンドメモリ領域:0.00KB 311: 利用可能サンプリング精度 311: プライマリ 16bit = OK 8bit = OK 312: セカンダリ 16bit = OK 8bit = OK 312: 利用可能チャンネル 312: プライマリ MONO = OK STEREO = OK 313: セカンダリ MONO = OK STEREO = OK 314:DirectSound の初期化は正常に終了しました 314:d3d11.dll の読み込み.... 成功 318:dxgi.dll の読み込み.... 成功 319:API CreateDXGIFactory のアドレスを取得します.... 成功 319:IDXGIFactory を作成します.... 成功 324:API D3D11CreateDevice のアドレスを取得します.... 成功 325:IDXGIAdapter を取得します.... 成功 325:Direct3D 11 FeatureLevel 11_0 以上を対象とします 326:ID3D11Device オブジェクトを取得します.... 失敗 348:DirectDraw オブジェクトの取得を行います.... 成功 352:引き続き初期化処理... 初期化に成功しました 404:IDirect3D9Ex オブジェクトを取得します.... 成功 407:IDirect3DDevice9Ex オブジェクトを取得します.... ハードウエア頂点演算を使用します 667:成功 668:Driver:igdumdx32.dll Description:Intel(R) HD Graphics Family 669:画面のフォーマットは D3DFMT_X8R8G8B8 です 669:16bit Zバッファフォーマットは D3DFMT_D16 です 670:24bit Zバッファフォーマットは D3DFMT_D24X8 です 670:32bit Zバッファフォーマットは D3DFMT_D24X8 です 670:16bit カラーフォーマットは D3DFMT_R5G6B5 です 671:32bit カラーフォーマットは D3DFMT_X8R8G8B8 です 671:アルファ付き 16bit カラーフォーマットは D3DFMT_A4R4G4B4 です 672:アルファ付き 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です 672:アルファテスト用 16bit カラーフォーマットは D3DFMT_A1R5G5B5 です 672:アルファテスト用 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です 673:DXT1テクスチャフォーマットはD3DFMT_DXT1 です 673:DXT2テクスチャフォーマットはD3DFMT_DXT2 です 673:DXT3テクスチャフォーマットはD3DFMT_DXT3 です 674:DXT4テクスチャフォーマットはD3DFMT_DXT4 です 674:DXT5テクスチャフォーマットはD3DFMT_DXT5 です 675:描画用 16bit カラーフォーマットは D3DFMT_R5G6B5 です 675:描画用 32bit カラーフォーマットは D3DFMT_X8R8G8B8 です 675:描画用アルファ付き 32bit カラーフォーマットは D3DFMT_A8R8G8B8 です 676:描画用ABGR整数16ビット型カラーフォーマットは D3DFMT_A16B16G16R16 です 676:描画用ABGR浮動小数点16ビット型カラーフォーマットは D3DFMT_A16B16G16R16F です 676:描画用ABGR浮動小数点32ビット型カラーフォーマットは D3DFMT_A32B32G32R32F です 677:描画用1チャンネル整数8ビット型カラーフォーマットは D3DFMT_A8R8G8B8 です 677:描画用1チャンネル整数16ビット型カラーフォーマットは D3DFMT_G16R16 です 677:描画用1チャンネル浮動小数点16ビット型カラーフォーマットは D3DFMT_R16F です 678:描画用1チャンネル浮動小数点32ビット型カラーフォーマットは D3DFMT_R32F です 678:描画用2チャンネル整数8ビット型カラーフォーマットは D3DFMT_A8B8G8R8 です 679:描画用2チャンネル整数16ビット型カラーフォーマットは D3DFMT_G16R16 です 679:描画用2チャンネル浮動小数点16ビット型カラーフォーマットは D3DFMT_G16R16F です 679:描画用2チャンネル浮動小数点32ビット型カラーフォーマットは D3DFMT_G32R32F です 680:一度に描画できるプリミティブの最大数:1048575 680:対応している最大頂点インデックス:16777215 680:同時にレンダリングできるバッファの数:4 681:最大テクスチャサイズ 幅:8192 高さ:8192 681:テクスチャステージテンポラリレジスタ:使用可 681:減算合成のハードウェア対応:ネイティブ 682:ハードウェア頂点シェーダーバージョンコード:300 682:エミュレーション頂点シェーダーバージョンコード:エミュレーション無し 683:ピクセルシェーダーバージョンコード:300 711:バックバッファロック転送の時間:3781nsec 一時的な描画可能バッファを使用した転送の時間:954nsec 712:バックバッファロックを使用しません 712:Zバッファを作成します.... 成功 773:プログラマブルシェーダーを使用します 855:フォントの初期化を行います 856:フォントの初期化は正常に終了しました 857:文字コードバッファの初期化を行います... 完了しました 4870:ChangeWindowMode実行 4872:ウインドウモードフラグが倒されました 4874:ウインドウスタイルをフルスクリーンモード用に変更します... 完了 4882:画面モード変更処理を開始します 4884: フォントの初期化を行います 4887: フォントの初期化は正常に終了しました 4966: Direct3DDevice9 の解放 2 4996: d3d9.dll の解放 1 4999: d3d11.dll の読み込み.... 成功 5000: dxgi.dll の読み込み.... 成功 5002: API CreateDXGIFactory のアドレスを取得します.... 成功 5002: IDXGIFactory を作成します.... 成功 5005: API D3D11CreateDevice のアドレスを取得します.... 成功 5006: IDXGIAdapter を取得します.... 成功 5007: Direct3D 11 FeatureLevel 11_0 以上を対象とします 5007: ID3D11Device オブジェクトを取得します.... 失敗 5029: DirectDraw オブジェクトの取得を行います.... 成功 5030: 引き続き初期化処理... 初期化に成功しました 5060: IDirect3D9Ex オブジェクトを取得します.... 成功
メンテ
Re: ループ時の処理負荷軽減方法 ( No.35 )
名前:管理人 日時:2015/02/22 22:06

ありがとうございます、チップさんのソースで手元でもハングが再現しました フルスクリーン解像度モードを DX_FSRESOLUTIONMODE_DESKTOP にした状態で ウインドウモードからフルスクリーンモードに変更しようとするとハングする、というバグでした 修正版をアップしましたので、よろしければお試しください m(_ _;m https://dxlib.xsrv.jp/temp/DxLibVCTest.exe // VisualC++ 用 https://dxlib.xsrv.jp/temp/DxLibBCCTest.exe // BorlandC++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_DevCppTest.exe // Dev-C++ 用 https://dxlib.xsrv.jp/temp/DxLibGCC_MinGWTest.exe // MinGW 用 https://dxlib.xsrv.jp/temp/DxLibDotNet.zip // .NET用 https://dxlib.xsrv.jp/temp/DxLibMakeTest.exe // ソース (中身を既存のライブラリのファイルに上書きして、BCCをお使いの 場合は『再構築』を、VCをお使いの場合は『リビルド』を、 Dev-C++をお使いの方は「Rebuild All(Ctrl+F11)」をして下さい)
メンテ
Re: ループ時の処理負荷軽減方法 ( No.36 )
名前:チップ(解決済) 日時:2015/02/23 07:57

こちらの環境でも問題なく動作することを確認いたしました。 細やかなご対応ありがとうございます!
メンテ
Re: ループ時の処理負荷軽減方法 ( No.37 )
名前:チップ 日時:2015/02/23 18:57

スレの本筋とは少し離れますが 管理人様に用意して頂いた修正版で問題なく動作は確認致しましたが、 ソースの方から再構築しようと ttp://dxlib.o.oo7.jp/temp/DxLibMakeTest.exe 上記から変更ソースをダウンロードしてコンパイルしたところ そのままだと通るのですが DxUseCLib.lib のスタティックライブラリを再構築すると(外せるものは全部外してDxUseCLib.libを再コンパイル)、 実行ファイルのリンク時に int CreateFontToHandle_PF( FONTMANAGE * ManageData, int DefaultCharSet ) ; int CreateFontToHandle_Error_PF( FONTMANAGE * ManageData ) ; int TerminateFontHandle_PF( FONTMANAGE *ManageData ) ; int FontCacheCharAddToHandle_Timing0_PF( FONTMANAGE *ManageData ) ; int FontCacheCharAddToHandle_Timing1_PF( FONTMANAGE *ManageData, FONTCHARDATA *CharData, const TCHAR *AddStr, int TextureCacheUpdate ) ; int FontCacheCharAddToHandle_Timing2_PF( FONTMANAGE *ManageData ) ; int EnumFontName_PF( ENUMFONTDATA *EnumFontData, int IsEx = FALSE, int CharSet = -1 ) ; 上の7つの関数が外部シンボル未定義エラーになるようです。 DxCompileConfig.h内の設定は //#define DX_NON_FONT はコメントアウトしたままです。 おそらくfont.cpp内を修正中で次回バージョンアップ時に対応されるおつもりだったのではないかなと思ったのですが 念のためご報告致します。
メンテ
Re: ループ時の処理負荷軽減方法 ( No.38 )
名前:管理人 日時:2015/02/24 03:42

すみません、最近 DxFontWin.cpp と DxFontWin.h というソースを追加しましたので、 DxLib.lib をビルドするプロジェクトに DxLibMakeTest.exe の中にある DxFontWin.cpp と DxFontWin.h を追加してビルドしてください
メンテ
Re: ループ時の処理負荷軽減方法 ( No.39 )
名前:チップ(解決) 日時:2015/02/24 05:05

ありがとうございます! 何度も細かい注文して申し訳ありません。 迅速なご対応に感謝しております。
メンテ

Page: 1 | 2 |

題名
名前
コメント
パスワード (記事メンテ時に使用)

   クッキー保存