deltaTimeの実装について

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

deltaTimeの実装について

#1

投稿記事 by タルカ » 9年前

最近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に収まらない場合に不具合が出てきました。
なので、デルタタイムを実装したいのですがどうすればいいかがいまいち良くわかりません。
どうすれば実装出来るのかヒントを下さい。お願いします

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

Re: deltaTimeの実装について

#2

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

とりあえずググります。
[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を渡す)
}
こんな感じだと思います。(テストはしていません)
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

hide

Re: deltaTimeの実装について

#3

投稿記事 by hide » 9年前

固定のフレームレートで収まらないなら何が重いのか調査したほうがいいかもしれませんよ。
開発者のマシンでフレームレートが落ちる状況でそのまま可変にしたら他の人のマシンで酷いことになるかと思います。

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

タルカ

Re: deltaTimeの実装について

#4

投稿記事 by タルカ » 9年前

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

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

閉鎖

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