ScreenFlip()の処理

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
t_white

ScreenFlip()の処理

#1

投稿記事 by t_white » 17年前

こんにちは。
前回の"ラジアンから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の場合のみ考慮できればいいです。

lbfuvab

Re:ScreenFlip()の処理

#2

投稿記事 by lbfuvab » 17年前

CRTとの同期を取らないとチカチカするかもしれません。
それならいっそwait_func書き換えて30fpsで動作する様にしたら軽くなるかも知れませんね。
void wait_fanc(){

    static int t=0;

    int term = GetNowCount()-t;

    if(16-term>0)

            Sleep(33-term);   //1000/30=33.333333・・・

    t=GetNowCount();

    return;

}

t_white

Re:ScreenFlip()の処理

#3

投稿記事 by t_white » 17年前

>>lbfuvab様
そうですか。
今のところ特にチカチカはしませんしこの処理の部分のCPU使用率も60fpsの状態で平均0%を保っているので
このままのコードを使ってみようと思います。
返信ありがとうございました<(_ _)>

閉鎖

“C言語何でも質問掲示板” へ戻る