回答:
いいえ、フレームレートは速度に影響しません。ゲームプレイはビデオパフォーマンスに完全に依存します。これは悲惨です(速度を制限しても、システムがゲームを半分の速度で実行するユーザーを制御することはできません)。
あなたが何か間違ったことをしたためにこの問題が発生しています:更新/レンダリングルーチンは可能な限り高速で次々と実行され、オブジェクトは呼び出しごとに更新されます(したがって、呼び出し速度が逸脱すると、その速度も変わります)。
これを行う正しい方法は、1秒ごとにオブジェクトを更新することです。
たとえば、弾丸について考えてみましょう。今のところ、おそらくフレームごとにどれだけ移動する必要があるかわかっています。これを1秒あたりの移動量に変換する必要があります。その方法は実際にはそれほど複雑ではありません。
まず、弾丸は1秒に複数回更新されるため、実際には数ミリ秒ごとに更新する必要があります。物理エンジンを更新するたびに、最後の更新から特定のミリ秒数が経過しました。これはデルタ時間と呼ばれ、通常は短縮してdtです。dtはすべてのオブジェクトを更新する前に決定され、すべてのオブジェクトは同期を保つために同じdtを使用して更新されます。dtは通常、更新呼び出しで各オブジェクトの引数として渡されます。
固定ステップの物理学では、dtは固定数ですが、可変ステップの物理学では、dtは最後の更新以降の実際の時間に応じて変化します(そのため、その名前です)。
これで弾丸に戻ります。物理エンジンが毎秒60回更新されるdtは16ミリ秒で更新するように言われています。弾丸が毎秒12メートル移動する場合、(16.0/1000.0) * 12.0
この更新で弾丸を移動します。
すべてのシステムでゲームを同じ速度で実行する最良の方法は、固定タイムステップを使用することです。
タイムステップが固定されているため、レンダリングレートが何であっても、ゲームは常に同じレートで更新され、補間を使用すると、レンダリングレートが更新レートよりはるかに高い場合でもスムーズに見えます。
これは、固定タイムステップを実装する方法に関するリソースを使用した回答です。
半固定または完全固定のタイムステップ?
これは、動きと変換のための補間を実装する方法を説明する答えです。
2つのゲーム状態を補間する方法は?
いいえ、それはすべきではありません。ゲームで実行できるタイミングの1つは、フレームベースのタイミングです。アイデアは、コンピューターが実行できるのと同じくらい速くゲームループを実行させ、それによって全体的なエクスペリエンスを強化し、シミュレーションの実行速度を制御することです。これで、更新をレンダリングから切り離し、それを正確に制御できるようになりました。
このシナリオでは、ゲームループは1台のマシンでは60 fps、別のマシンでは45かそれと異なる可能性がありますが、シミュレーションは常にそれらの間で指定された正確なレートで実行されます。
ゲームは2つのセクションに分かれています。1つはグラフィックスのレンダリング用、もう1つはシミュレーションの更新用です。ゲームの開始時に希望のシミュレーションレートを設定し、ゲームループの上部で経過時間を取得します。この経過時間は、目的のシミュレーションレートに基づく時間量であることに注意してください。この値は、ゲームオブジェクトに対する乗数として使用され、それらを希望のシミュレーションレートで、または非常に近くに移動し続けます。たとえば、シミュレーションを30 fpsで更新し、ゲームループが現在60 fpsで実行されている場合、このフレームの経過時間の値は0.5になります。これに移動オブジェクトの速度を掛けると、30 fpsで移動します。フレームごとにゲームのループ速度が大きく異なり、フレームベースのタイミングによってシミュレーションを既知の予測可能な速度で実行し続けることができることを理解してください。
その結果、滑らかで滑らかなアニメーションになります。