ページ 11

ScreenFlip,ProcessMessageの処理速度について

Posted: 2016年12月19日(月) 11:05
by akihito
初めまして。
今回PCを新調したため、1からゲーム制作を再開しようと思っていたところで壁にぶつかってしまったためご相談させて頂きます。

ゲームのメインループ部分を実装し、FPS管理を行いフレームレートを計算したところ、
40~44FPSあたりを行ったり来たりと、60FPSに届かない状態でした。

どこで遅延しているのかFPS管理を一時的に外し、各処理で計算してみたところ
ScreenFlip()は約16~17ms。
ProcessMessage()は、0ms。約3回に1度16~17ms。
という結果になりました。(それ以外の箇所に問題はございません)

現在は他に比較できる環境ないため、この処理速度が異常かどうかも判断があやふやなところですが
ProcessMessageが3回に1度の頻度で16~17msという部分がどうにも引っかかっております。

コード:

	ChangeWindowMode(TRUE);					// ウィンドウモードの設定
	SetGraphMode(SCREEN_SIZE_X, SCREEN_SIZE_Y, COLOR_BIT_DEPTH);	//  画面モードの変更
	SetDrawScreen(DX_SCREEN_BACK);									// 描画先グラフィック領域の設定
	DxLib_Init();

	int endFlag = 0;
	int time01, time02, time03, time04, time05;
	while (!endFlag) {
		time01 = GetNowCount();
		ScreenFlip();					time02 = GetNowCount();
		endFlag = ProcessMessage();		time03 = GetNowCount();
		ClearDrawScreen();				time04 = GetNowCount();
		clsDx();						time05 = GetNowCount();

		printfDx("1to2 %2d[ms]\n", time02 - time01);	// ScreenFlip処理速度
		printfDx("2to3 %2d[ms]\n", time03 - time02);	// ProcessMessage処理速度
		printfDx("3to4 %2d[ms]\n", time04 - time03);
		printfDx("4to5 %2d[ms]\n", time05 - time04);
	}
また補足として、ScreenFlip処理の直後に
WaitTimer(10); と指定すると、ProcessMessageの処理速度は0msで安定してくれます。
WaitTimer(5); と指定すると、5~7ループに1度、16~17msとなることを確認しています。

具体的な解決方法がございましたらなによりですが、
他環境でのScreenFlip, ProcessMessageの処理速度だけでも教えて頂ければと思います。
よろしくお願いします。

※以下はPCスペック/設定等になります。
・Windows 10 Home(x64)
・RAM:8.00GB
・グラボ:NVIDIA GeForce GTX 1060 3GB
・DirectX バージョン:12
・リフレッシュレート:60

Re: ScreenFlip,ProcessMessageの処理速度について

Posted: 2016年12月19日(月) 12:06
by みけCAT
akihito さんが書きました:ゲームのメインループ部分を実装し、FPS管理を行いフレームレートを計算したところ、
40~44FPSあたりを行ったり来たりと、60FPSに届かない状態でした。
SetDrawScreen(DX_SCREEN_BACK);を呼び出すのをDxLib_Init();の後にすると改善するかもしれません。

Re: ScreenFlip,ProcessMessageの処理速度について

Posted: 2016年12月19日(月) 12:40
by akihito
>みけCATさん
みけCAT さんが書きました:
akihito さんが書きました:ゲームのメインループ部分を実装し、FPS管理を行いフレームレートを計算したところ、
40~44FPSあたりを行ったり来たりと、60FPSに届かない状態でした。
SetDrawScreen(DX_SCREEN_BACK);を呼び出すのをDxLib_Init();の後にすると改善するかもしれません。
ご回答ありがとうございます。

ご指摘通り、処理の順番を

コード:

DxLib_Init();
SetDrawScreen(DX_SCREEN_BACK);
としたところ、FPSも正常に60.0で計測できました。
ありがとうございます。

お決まりの呪文のように書いてしまっていたため、システム内部まで理解せずに使用していたのが今回の原因です。
少し冷静になって、見えない部分の処理にも一度目を通していこうと思います。

改めてありがとうございました。「解決!」とさせて頂きます。