経過時間を蓄積し、制限付き更新を実行します
各アニメーション コールバックで、経過時間をアキュムレータに追加します。アキュムレータに少なくとも 1 つのステップが含まれている間、1/60 秒などの一定の間隔で物理演算を更新し、その間隔を減算します。次に、最新の状態をレンダリングします。フレームごとのキャッチアップ ステップの最大数を設定します。そうしないと、長い一時停止によって大量のバックログが発生し、より多くの時間を消費し、遅延がさらに深くなる可能性があります。超過時間を削除するか、制限するか、または別の回復ルールによって処理するかを明示的に決定します。
単位の一貫性を保ちます。速度が 1 秒あたりのワールド単位で測定される場合は、各シミュレーション更新内の固定ステップを乗算します。同じ速度にフレームの全経過時間を掛けたり、複数の固定更新を実行したりしないでください。そうしないと、動きが 2 回カウントされます。
独自の境界で入力とレンダリングを処理する
各シミュレーション ステップの入力をサンプル保持するか、ワンショット アクションをステップで消費されるまでキューに入れます。 2 つのフレームの間にキーが押された場合は、次の更新までにキーが失われないようにしてください。レンダリングでは物理状態間を補間できますが、衝突とスコアリングではシミュレーション状態が使用されます。 MDN は、requestAnimationFrame を再描画前にスケジュールされたワンショット コールバックとして説明し、そのタイムスタンプを使用して進行状況を計算することを推奨しています。アキュムレータはそのタイムスタンプを使用して更新を一定間隔に保ちます。
ループの限界をテストする
通常のフレーム、シミュレートされた遅いフレーム、および長い一時停止の間で、同じ短い動きと衝突を比較します。プレーヤーが薄い壁をトンネルで通過したり、長いフレーム停止後に余分な速度を上げたり、追い上げ中に数回衝突を引き起こしたりしないことを確認します。意図したルールに従って、一時停止と非表示タブの復帰をテストします。固定ステップ ループによりシミュレーションが安定しても高速で衝突が失敗する場合は、レンダリング周波数を上げるのではなく、モーションに適した衝突方法を使用してください。
固定タイムステップ ゲームの物理学についての質問
固定タイムステップは決定論的な物理学を保証しますか?
いいえ、シミュレーション間隔は一定になりますが、入力タイミング、計算、衝突順序によって変動が生じる可能性があります。再生が必要なテストについては、これらを個別に制御します。
フレームストール後のキャッチアップ更新に制限を設けるのはなぜですか?
無制限に追いつくと、後のフレームを独占し、遅延が悪化する可能性があります。シミュレートされた時間を破棄できるかどうかなど、ゲームに適した回復ポリシーを選択してテストします。
関連情報
古い情報を見つけましたか? 訂正を連絡