ページ 11

垂直同期について

Posted: 2012年2月23日(木) 02:24
by L'z
DXライブラリのSetWaitVSyncFlag関数を使い垂直同期なしでフレーム制御をしようとして気になったことです。

垂直同期をしなかったらScreenFlipは待つ必要が無いのだから一瞬で終わるのかと思い、
ScreenFlipの前後でGetNowCountをして時間差を求めました。
すると15~18msかかっていて約1フレーム分待っています。
垂直同期をするようにしたら18~20msくらいでした。

他の処理が重いのかと思い、(ScreenFlip前後なので他の処理は全く関係ないのですがそのときは勘違いしていました)
簡単なプログラム

コード:

#include "DxLib.h"

int WINAPI WinMain( HINSTANCE hInstance, HINSTANCE hPrevInstance,
                        LPSTR lpCmdLine, int nCmdShow )
{

	ChangeWindowMode(TRUE);
	SetDrawScreen(DX_SCREEN_BACK);
	SetWaitVSyncFlag(FALSE);
	if( DxLib_Init() == -1 ) return -1;
	
	int i,j,white=GetColor(255,255,255);
	while( !ProcessMessage() ){

		i = GetNowCount();
		ScreenFlip();
		j = GetNowCount();
		ClearDrawScreen();
		DrawFormatString(0,0,white,"%d",j-i); // ScreenFlip 前後の時間差を表示

	}

	DxLib_End();
	return 0;

}
を作ってみたところ9~10msになりました。
この違いは画面のサイズや画像を表示しているかいないかの違いなのかと思いますが
(それだけの違いで5msは大きい気もします)これでも9~10msかかっています。
表画面と裏画面の交換だけなのにこんなにかかるものなのでしょうか?

Re: 垂直同期について

Posted: 2012年2月23日(木) 04:01
by ISLe
環境が書いてありませんが、Windows Vista/7のAeroテーマではウィンドウズ側で垂直同期が行われるという話を聞いたことがあったのですけど、ウチのWindows 7 x64 + NVIDIA GeForce GTS 250 ドライババージョン295.73というマシンで試してみたら遅延しませんでした。
ほとんど0でたまに1が表示される感じです。
環境によって違うのでしょうかね。
垂直同期をするようにしたら16か17を表示するので根本的に違うのかもしれませんが。

Windows Vista/7であればAeroテーマを切ってみたら違う結果が出るかもしれません。

Re: 垂直同期について

Posted: 2012年2月23日(木) 09:31
by softya(ソフト屋)
とりあえずウィンドウモードとフルスクリーンモードで動作が違うのでフルスクリーンモードで試していただけますか?

Re: 垂直同期について

Posted: 2012年2月23日(木) 15:23
by L'z
ISLe さんが書きました:環境が書いてありませんが、Windows Vista/7のAeroテーマではウィンドウズ側で垂直同期が行われるという話を聞いたことがあったのですけど、ウチのWindows 7 x64 + NVIDIA GeForce GTS 250 ドライババージョン295.73というマシンで試してみたら遅延しませんでした。
ほとんど0でたまに1が表示される感じです。
環境によって違うのでしょうかね。
垂直同期をするようにしたら16か17を表示するので根本的に違うのかもしれませんが。

Windows Vista/7であればAeroテーマを切ってみたら違う結果が出るかもしれません。
環境はWinXP SP3 です。
実行はVC++2010ExpressでDxライブラリは3.06eを使用しています。
softya(ソフト屋) さんが書きました:とりあえずウィンドウモードとフルスクリーンモードで動作が違うのでフルスクリーンモードで試していただけますか?
フルスクリーンで試してみたところ2~4msでときどき2桁になる程度になり、改善できました。
ウィンドウモードでは正しく垂直同期をしないようにできないのでしょうか?
垂直同期を行うようにすると5msくらいの違いが出たので意味がないということはないと思うのですが。

Re: 垂直同期について

Posted: 2012年2月23日(木) 15:34
by softya(ソフト屋)
今気づきましたが、SetDrawScreen(DX_SCREEN_BACK);はDxLib_Initの後じゃないとマズイ気がします。

Re: 垂直同期について

Posted: 2012年2月23日(木) 16:54
by ISLe
お使いのグラフィックボードとかドライバのバージョンを教えていただくことはできないのでしょうかね。

Re: 垂直同期について

Posted: 2012年2月23日(木) 18:40
by L'z
softya(ソフト屋) さんが書きました:今気づきましたが、SetDrawScreen(DX_SCREEN_BACK);はDxLib_Initの後じゃないとマズイ気がします。
あ、逆になってますね。
直して実行してみましたが結果は変わらずです。
ISLe さんが書きました:お使いのグラフィックボードとかドライバのバージョンを教えていただくことはできないのでしょうかね。
グラフィックボードは積んでいないのでオンボードで
チップセット
Mobile Intel(R) 4 Series Express Chipset Family
です。
バージョンというのはどこをみるのかわからないのですが
DierctX診断ツールのディスプレイドライバには
igxprd32.dll
6.14.0010.4994
とかかれていました。

単にスペックが低いということなのでしょうか。

Re: 垂直同期について

Posted: 2012年2月23日(木) 18:54
by softya(ソフト屋)
ノートPCですね。
Mobile Intel(R) 4 Series Express Chipset Family
だけだと性能が分からないのでノート自体のメーカー型番を教えて下さい。
ただ、性能がかなり低いことは覚悟して下さい。

ちなみに四聖龍神録は遅延なく実行できるのでしょうか?
http://dixq.net/sr/

Re: 垂直同期について

Posted: 2012年2月23日(木) 19:27
by L'z
softya(ソフト屋) さんが書きました:ノートPCですね。
Mobile Intel(R) 4 Series Express Chipset Family
だけだと性能が分からないのでノート自体のメーカー型番を教えて下さい。
ただ、性能がかなり低いことは覚悟して下さい。

ちなみに四聖龍神録は遅延なく実行できるのでしょうか?
http://dixq.net/sr/
四聖龍神録を実行してみました。
タイトル画面でFPSは20程度で「非常にスペック不足と出ました」。
今までフリーのゲームをする分には困らなかったし(3Dのネットゲームではないです)、
自分が作りかけのもののタイトル画面ではFPSが50~55程度だったのでそこまでひどくはないだろうと
思っていたのですがPCのスペックが問題だったようです。

同じくWinXP SP3 オンボードのデスクトップでScreenFlipの時間を表示するプログラムを
動かしてみたところ5ms前後でこのPCよりは早くなりましたが0msや1msとはいきませんでした
DirectXを使ったものはやはりグラフィックボードがないと厳しいみたいですね。

自分のPCのスペックが原因とわかったので解決にします。
ありがとうございました。

Re: 垂直同期について

Posted: 2012年2月23日(木) 19:34
by softya(ソフト屋)
L'z さんが書きました: 今までフリーのゲームをする分には困らなかったし(3Dのネットゲームではないです)、
参考に快適だったゲームを教えて下さいませんか?
どのようなテクニックで快適に遊べるようにしているのか気になります。

Re: 垂直同期について

Posted: 2012年2月23日(木) 22:07
by ISLe
むかしは内部で保持する画像やオフスクリーンのピクセルフォーマットをデバイス画面と同じにしておかないととっても(転送が)遅くなることがありましたけど。

龍神録の設定.exeで色数(16/32ビット)を切り替えても変わらないですかね。
ウィンドウモードならデスクトップの色数が24ビットになってるとか。