ページ 11

deltaTimeの実装について

Posted: 2015年12月20日(日) 00:23
by タルカ
最近Unityを触りまして、そこでdeltaTimeと言う機能がありました。

今、自分はDirectX9でゲームを作っていまして、現在60fpsの固定フレームでゲームループを作成しています。

コード:

timeBeginPeriod(1);
oldTime=timeGetTime();

/*ここからゲームループ*/
while(1)
{
	if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
	{
		if(GetMessage(&msg,NULL,0,0)==0)
		{
			break;
		}
			TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	nowTime=timeGetTime();
	if((nowTime-oldTime)>=16)
	{
		oldTime=nowTime;
		GameMain();			//ゲームメイン
		
	}
}
しかし、固定フレームだと処理が60fpsに収まらない場合に不具合が出てきました。
なので、デルタタイムを実装したいのですがどうすればいいかがいまいち良くわかりません。
どうすれば実装出来るのかヒントを下さい。お願いします

Re: deltaTimeの実装について

Posted: 2015年12月20日(日) 00:37
by みけCAT
とりあえずググります。
[search=google]deltaTime[/search]
例えば
Time.deltaTimeとは何か。 #Unity | Alternativeニッキ
ここによると、deltaTimeは前のフレームからこのフレームまでの経過時間のようなので、

コード:

timeBeginPeriod(1);
oldTime=timeGetTime(); /* 前のフレームの時刻 */

/*ここからゲームループ*/
while(1)
{
	if(PeekMessage(&msg,NULL,0,0,PM_NOREMOVE))
	{
		if(GetMessage(&msg,NULL,0,0)==0)
		{
			break;
		}
			TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	nowTime=timeGetTime(); /* 今のフレームの時刻 */
	deltaTime=nowTime-oldTime; /* 前のフレームから今のフレームまでの時間 */
	oldTime=nowTime; /* 今のフレームの時刻を(次のフレームで使う)前のフレームの時刻として保存 */
	GameMain(deltatime);			//ゲームメイン(deltaTimeを渡す)
}
こんな感じだと思います。(テストはしていません)

Re: deltaTimeの実装について

Posted: 2015年12月20日(日) 00:51
by hide
固定のフレームレートで収まらないなら何が重いのか調査したほうがいいかもしれませんよ。
開発者のマシンでフレームレートが落ちる状況でそのまま可変にしたら他の人のマシンで酷いことになるかと思います。

なぜ重いのかを知ったうえで仕方ないのであればいいですが、対処療法的にやるのはよろしくないかと。
(調査済みならごめんなさいね。)

Re: deltaTimeの実装について

Posted: 2015年12月20日(日) 01:10
by タルカ
>>みけCATさん
例えば60fpsの場合1フレームに対して10移動させたいオブジェクトがあった場合、
そのデルタタイムを1秒間を60で割った数値で割ってあげれば、
x=x+10*デルタタイム;
になるって感じですかね?
思ってたより単純でした…

>>hideさん
デバッグモードで色々描画処理を加えるとfpsが落ちてしまうのです…