# ゲームループの中にある時計を理解する
レンダリングされた各フレームは、ゲームに新しい経過時間を渡します。可変デルタのループでは、動きをposition += velocity × frameTime のように更新します。フレームが安定していれば平均速度は意図した値に近づきますが、1回の更新はそれを発生させたフレームと同じ大きさになります。ヒッチは単なる映像の停止ではなく、その更新が消費するゲーム時間を変えます。# 可変積分と固定アキュムレーターを比較する
固定タイムステップのループは各フレームの時間をアキュムレーターに加え、16.667 ms のような選択したステップを繰り返し消費します。シミュレーションには同じ大きさの更新が届き、レンダリングは別のリズムで動けます。余った端数は次のフレームまで残ります。長いフレームでは、経過時間を処理するために複数の小さな更新を実行します。ステップは安定しますが、追いつき処理の負荷が跳ね上がることがあります。| 状況 | 可変デルタの経路 | 固定タイムステップの経路 | 検討する判断 |
|---|---|---|---|
| 安定した描画 | 通常のフレーム時間で1回更新 | 均一なステップで蓄積時間を消費 | 両方が同じ動きに近づくか確認します。 |
| 長いフレーム | 大きな更新でオブジェクトが進みすぎる | 複数の固定更新で時間に追いつく | 位置差と追いつき数を一緒に読みます。 |
| 異なる描画速度 | 更新サイズがフレームレートで変化 | シミュレーションステップは一定 | 固定ステップは描画速度への依存を減らします。 |
| デルタ上限 | 上限を超えた時間を無視 | アキュムレーターは全時間を受け取る | 時間を失ってもよい場合だけ制限します。 |
# フレームスパイクの実際の影響を見る
毎秒60フレームでは、通常のフレームは約16.667 ms です。追加の 80 ms スパイクがあると、1フレームは約 96.667 ms になります。可変モデルはこの時間を1回の更新で消費します。固定モデルは代わりに約6回の 16.667 ms ステップを消費します。経過時間の合計は同じでも、シミュレーション内の経路は異なる場合があります。# 位置のずれと追いつき処理を一緒に読む
位置差は可変経路から固定経路を引いた値です。2つの積分方針がどれだけ離れたかを示しますが、どちらが自動的に正しいかは決めません。追いつき数は、1つの描画フレーム内で必要だった固定処理の量を示します。大きな位置差は見える動きの違いを示し、多い追いつきステップはCPU予算の問題を示す可能性があります。関連していますが、同じ診断ではありません。# デルタ上限を方針として扱う
上限は、停止中のタブ、ブレークポイント、深刻なヒッチによってキャラクターが瞬間移動したり、物理ボディがジオメトリを通り抜けたりするのを防げます。その代わり可変時計は実際に経過した時間より遅れます。時間を保つ必要があるゲームでは、固定アキュムレーターなど別の回復方針を使います。ジャンプを抑えて応答性を保ちたい場合は上限が役立ちますが、失う時間を意図して選ぶ必要があります。# 守るべき仕事に合わせてループを選ぶ
| ゲームループの仕事 | 役立つ初期設定 | 理由 |
|---|---|---|
| 物理、衝突、決定論的なゲームプレイ | 固定タイムステップ | 均一なステップで描画リズムへの依存を減らします。 |
| 状態を蓄積しない単純な視覚運動 | 可変デルタ | 更新が小さく、通常は追いつきキューが不要です。 |
| 滑らかな表示を伴うゲームプレイシミュレーション | 補間付き固定更新 | シミュレーションのステップを保ち、表示側で端数を隠せます。 |
| 深刻な停止からの回復 | 上限付きの追いつき方針 | 1回の悪いフレームが無制限の計算を生まないようにします。 |