ゲームでマウスを探したり歩いたりしていますが、非常に遅くて使いにくいです。固定速度を使用しているからだと思います。大きなプロジェクトでは、開発者はデルタ時間を使用すると聞きました。過剰時間でデルタ時間を計算するにはどうすればよいですか?デルタ時間を使用して速度を計算するにはどうすればよいですか?
ゲームでマウスを探したり歩いたりしていますが、非常に遅くて使いにくいです。固定速度を使用しているからだと思います。大きなプロジェクトでは、開発者はデルタ時間を使用すると聞きました。過剰時間でデルタ時間を計算するにはどうすればよいですか?デルタ時間を使用して速度を計算するにはどうすればよいですか?
回答:
「デルタ時間」は、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の固定タイムステップと可変タイムステップを読む必要があります。
positive int
は通常、署名されている場合は2.147.483.647まで、署名されていない場合は4.294.967.295まで続きます。したがって、小さい方を考えても、2.147.483.647ミリ秒はほぼ25日です。ほとんどのゲームを処理するのに十分なはずです。タイマー、そしてそれが十分ではない場合でも、私たちはまだ合理的に使用することができますunsigned int
(〜50日)またはさらにlong long
(私は通常)。
QueryPerformanceCounter
Windowsやgettimeofday
他のほとんどのプラットフォームで使用するプラットフォームコードを少し書くだけでも悪くありません。特にCとC ++では、手を汚して、プラットフォームAPIの最も一般的な分母以上のものを狙う必要があります。