トップページ > 記事閲覧
SetAlwaysRunFlag( TRUE)について
名前:さと 日時: 2019/08/10 13:46

管理人様、いつもお世話になっております。 表題の関数を使って【ウインドウがアクティブではない状態でも処理を続行】にして 以下のサンプルプログラム(フレームカウント)では、期待通りに動作しますが ウインドウタスクバーに入れてから戻ってみると、1秒間のフレームカウントが 数千〜数万フレームほど描画をするようです、ご確認をよろしくお願い致します。 DXライブラリのバージョンは3.20fで、Windows 7の環境で現象が出ています。 #include "DxLib.h" int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow) { LONGLONG ProgressTime; // 時間経過(1秒を測定) int FrameCounter = 0; // カウンター(フレーム) ChangeWindowMode( TRUE); // ウィンドウモード SetGraphMode( 640, 480, 32); // ウィンドウサイズ SetAlwaysRunFlag( TRUE); // 処理を続行させる if( DxLib_Init() == -1) { // DXライブラリの初期化 return -1; // エラーが起きたら直ちに終了 } SetDrawScreen( DX_SCREEN_BACK); // 裏画面の書き込み許可 ProgressTime = GetNowCount(); // 時間経過 (ミリセコンド) // ループ ※ESCキーを押すと終了する while( CheckHitKey( KEY_INPUT_ESCAPE) == 0) { if( ProcessMessage() == -1) { // プロセスメッセージのチェック break; } ClearDrawScreen(); // 画面の初期化 ScreenFlip(); // スクリーンフリップ FrameCounter++; // カウント(フレーム) // 時間経過(1秒を測定) if( (GetNowCount() - ProgressTime) >= 1000) { ProgressTime = GetNowCount(); // 時間経過 (ミリセコンド) printfDx( "%d\n", FrameCounter); FrameCounter = 0; // クリアー } } DxLib_End(); // DXライブラリの終了処理 return 0; // 正常終了 }
メンテ

Page: 1 |

Re: SetAlwaysRunFlag( TRUE)について ( No.1 )
名前:管理人 日時:2019/08/12 01:26

ご指摘の動作は仕様となります ウィンドウが最小化された状態では描画処理もScreenFlipによる『裏画面を表画面に反映する処理』も行われず、 ScreenFlip内で行われるはずの『垂直同期信号待ち(VSYNC待ち)』も行われない為、 メインループが高速で処理されることになります ウィンドウが最小化された状態でのメインループの高速処理を避ける場合は ウィンドウが最小化されているかどうかを取得するための関数 GetWindowMinSizeFlag を使用して、 GetWindowMinSizeFlag の戻り値が TRUE であったら Sleep( 16 ); で適当にウェイトを入れるなどの 処理を追加してください m(_ _)m // メインウインドウが最小化されているかどうかを取得する // ( 戻り値 TRUE:最小化されている FALSE:最小化されていない ) int GetWindowMinSizeFlag( void ) ; 例: if( GetWindowMinSizeFlag() == TRUE ) { Sleep( 16 ) ; }
メンテ
Re: SetAlwaysRunFlag( TRUE)について ( No.2 )
名前:さと(解決済み) 日時:2019/08/12 20:00

お世話になっております。 >ご指摘の動作は仕様となります なるほど〜、お手数をおかけ致しました。 >適当にウェイトを入れるなどの処理を追加してください 了解しました、この方法で対応します。 ありがとうございました。
メンテ

Page: 1 |

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

   クッキー保存