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

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

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

#1

投稿記事 by akihito » 8年前

初めまして。
今回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

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

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

#2

投稿記事 by みけCAT » 8年前

akihito さんが書きました:ゲームのメインループ部分を実装し、FPS管理を行いフレームレートを計算したところ、
40~44FPSあたりを行ったり来たりと、60FPSに届かない状態でした。
SetDrawScreen(DX_SCREEN_BACK);を呼び出すのをDxLib_Init();の後にすると改善するかもしれません。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

akihito

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

#3

投稿記事 by akihito » 8年前

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

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

コード:

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

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

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

閉鎖

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