前回の"ラジアンから8方向の何処を向いているかを調べる関数"のスレでは本当にお世話になりました。
世話になりっぱなしですみませんが今度はDXライブラリのScreenFlip()についての疑問に答えていただけると助かります。
ウィンドウモードの1024×768の画面でゲームを作っていて気になったのですが
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
ChangeWindowMode(TRUE); //ウィンドウモード
//画面サイズ変更
if(SetGraphMode(1024,768,32)!=DX_CHANGESCREEN_OK){
MessageBox(NULL,TEXT("画面サイズの変更に失敗しました。\n1024×768の画面サイズに対応している環境か確認して下さい。\n終了します。"),TEXT("エラー"),MB_OK);
return -1;
}
if(DxLib_Init()==-1||SetDrawScreen(DX_SCREEN_BACK)!=0)return -1;
while(!ProcessMessage() && !ClearDrawScreen()){
ScreenFlip();
}
DxLib_End();
return 0;
}
上のコードではメインループでScreenFlip()以外の何の処理もしていないのにも関わらず自分の環境(Core2Duo E6600 2.40GHz)ではCPU使用率:20~23%にも達しています。
原因はScreenFlip()の”CRTの垂直同期信号待ちをする処理”がものすごく重い為だと思いました。
//ゲームプログラミングの館 s5. 処理速度を一定にする。にあったコードを使用させて頂きました。
void wait_fanc(){
static int t=0;
int term = GetNowCount()-t;
if(16-term>0)
Sleep(16-term);
t=GetNowCount();
return;
}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
同上
while(!ProcessMessage() && !ClearDrawScreen()){
wait_fanc();
ScreenFlip();
}
同上
}
に書き換えてScreenFlipへの負担を減らしたところ、CPU使用率:3~19% 平均4% にまで落ちました。更に、
//CPU使用率0
//ゲームプログラミングの館 s5. 処理速度を一定にする。にあったコードを使用させて頂きました。
void wait_fanc(){同上}
int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nShowCmd){
同上
SetWaitVSyncFlag(FALSE); //ScreenFlip関数 実行時にCRTの垂直同期信号待ちをしない
while(!ProcessMessage() && !ClearDrawScreen()){
wait_fanc();
ScreenFlip();
}
同上
}
にして処理の重さの原因だと思われる"CRTの垂直同期信号待ちをする処理"自体を解除してみたらCPU使用率:0~1%とものすごく落ちました。画像を描画させたりしてもCPU使用率0~2%程度で正常動作しています。
しかしこのように処理を解除してしまうといろいろな弊害がある可能性が高いと思うのですが、大丈夫でしょうか。
大丈夫ではない場合は処理の軽さを保ったままの解決策をご教示して頂けると助かります。
DXライブラリを実際に使用してゲームなどを作ったことがある方はこの重いScreenFlip処理をどのようにかわしているのでしょうか・・・。
モニターのリフレッシュレートは60fpsの場合のみ考慮できればいいです。