デルタ時間を取得して使用する方法


13

ゲームでマウスを探したり歩いたりしていますが、非常に遅くて使いにくいです。固定速度を使用しているからだと思います。大きなプロジェクトでは、開発者はデルタ時間を使用すると聞きました。過剰時間でデルタ時間を計算するにはどうすればよいですか?デルタ時間を使用して速度を計算するにはどうすればよいですか?


C11およびC ++ 11には現在、ナノ秒クロックがあります:stackoverflow.com/a/36095407/895245 || stackoverflow.com/a/5524138/895245
Ciro Santilli新疆改造中心法轮功六四事件

回答:


17

「デルタ時間」は、2つのフレーム更新の間に経過した時間でした(ただし、他のコンテキストでも使用できます。これは通常、時間の減算の結果です)。

glutGetメソッドとGLUT_ELAPSED_TIMEパラメーター、およびいくつかの操作を使用して、過剰なデルタ時間を取得できます。

次の行は、glutInitが呼び出されてから(または最初にglutGet(GLUT_ELAPSED_TIME)を呼び出して)ミリ秒数を返します:

int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);

したがって、各レンダリングループで現在のtimeSinceStartを登録すると、古いものを新しいものから減算することでdeltaTimeを知ることができます。

int oldTimeSinceStart = 0;

while( ... )
{
     int timeSinceStart = glutGet(GLUT_ELAPSED_TIME);
     int deltaTime = timeSinceStart - oldTimeSinceStart;
     oldTimeSinceStart = timeSinceStart;

     //... stuff to update using deltaTime
}

また、C / C ++ ctimeライブラリclock()とともに使用し、クロックティックと秒の関係を指定するマクロ定数式CLOCKS_PER_SECを使用して、ほぼ同じ方法で実行できます。


基本的に、固定の時間値を使用する代わりに、deltaTimeを使用して、この経過時間に対する比率で動きを更新できます。このように、プログラムが60 fpsで実行される場合と10 fpsで実行される場合、キャラクターの移動速度はほぼ同じである必要があります。


次に小さな例を示します。x軸上で毎秒10単位だけ何かを動かしたいとします。このようなことができます(deltaTimeが実際にミリ秒を使用している場合)。

Position.x += 10/1000 * deltaTime;

このように、プログラムが2回更新されても100回更新されても、1秒後に位置はほぼ同じになり、固定値を使用する場合よりも小さいコンピューターの低いfpsによるゲームプレイへの影響が少なくなります。

  • 固定値==>低fps =少ない更新=遅い動きに対して、高いfps =より多くの更新=非常に速い動き。

  • deltaTime ==>「ほぼ」同じ動きで。


最後に、gamedev.stackexchangeの固定タイムステップと可変タイムステップを読む必要があります。


ミリ秒を整数として返しますか?大きく、おそらく十分ではありません。私は常にプラットフォーム固有のタイマーを使用する必要がありましたが、ゲームにはあまり適していなかったため、疫病のようなGLUTは避けました。
ショーンミドルディッチ

@Sean GLUTも使用していませんが、それは質問のパラメータにあったので、これを念頭に置いて答えました;)しかし、ゲームのミリ秒を処理するintの「不足」に関するあなたの立場に興味があります。A positive intは通常、署名されている場合は2.147.483.647まで、署名されていない場合は4.294.967.295まで続きます。したがって、小さい方を考えても、2.147.483.647ミリ秒はほぼ25日です。ほとんどのゲームを処理するのに十分なはずです。タイマー、そしてそれが十分ではない場合でも、私たちはまだ合理的に使用することができますunsigned int(〜50日)またはさらにlong long(私は通常)。
ヴァルケア

1
@Valkeaポイントは最大値ではなく、ローエンドでの解像度です。60 FPSの単一フレームはわずか16 2 / 3rd msであるため、1msの精度(ミリ秒を整数で表すことから)は、5%を超えるエラーマージンを表します。マイクロ秒の整数カウントは耐えられますが、ミリ秒は粗すぎます。
スティーブンスタドニッキー

ええ、あなたは多くのもののためにサブミリ秒のタイミングとそれを見つけるための高解像度タイマーが必要です。QueryPerformanceCounterWindowsやgettimeofday他のほとんどのプラットフォームで使用するプラットフォームコードを少し書くだけでも悪くありません。特にCとC ++では、手を汚して、プラットフォームAPIの最も一般的な分母以上のものを狙う必要があります。
ショーンミドルディッチ

このような精度は、すべてのゲームに役立つわけではありません。しかし、これは非常に興味深い説明であり、intとクロックに関するあなたの視点についての私の質問に完全に答えています。まだ高精度の時計は必要ありませんでしたが、この問題についての知識を深める時が来たと思います。ありがとうございます;)
ヴァルケア
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.