コード内でユニットを見えるようにする
時間の単位を一つ選び、一貫して使います。速度をピクセル/秒、デルタを秒で表す場合、位置は「速度×デルタ」だけ進みます。手動で確認するには、毎秒80ピクセルに設定したマーカーを10秒間動かします。描画回数にかかわらず、ゲーム世界内で約800ピクセル進むはずです。
performance.now() のミリ秒を、1,000で割らずに毎秒単位の速度と組み合わせないでください。deltaSeconds や speedPixelsPerSecond のように、変数名に単位を含めます。後から調整した際、小さな移動量が気づかないうちに千倍になってしまうのを防げます。
ヒッチの影響を制限する
シンプルなアクションゲームでは、デルタに意図した上限を設け、負荷が大きいときはシミュレーションが一時的に遅くなることを許容します。再現性のあるステップが必要な物理シミュレーションでは、時間を蓄積して一定間隔で進めます。追いつき処理の回数にも上限を設け、復旧処理自体がページを占有しないようにします。どちらの方法にもトレードオフがあるため、ゲームの手触りとルールに合わせて選びます。
更新の間に人工的な停止を入れてテストし、直線移動と経路の終端での衝突を比べます。オブジェクトが薄い障害物をすり抜ける場合、より小さなサブステップや掃引衝突判定が必要かもしれません。描画レートだけを変えても、ルール上の問題は解決しません。
ゲームのデルタタイムについての質問
デルタタイムを使えば物理シミュレーションは決定論的になりますか?
いいえ。更新間隔が変動すると、積分結果も異なる場合があります。シミュレーションを固定ステップにすると再現性は高まりますが、入力のタイミングや浮動小数点演算の細部も影響します。
経過時間にはどの時計を使えばよいですか?
アニメーション コールバック タイムスタンプまたは Performance.now() を使用します。どちらも MDN で説明されている高解像度タイミング ソースです。システム クロックの調整はシミュレーション時間とは無関係であるため、短いフレーム間隔には実時計の日付を使用しないでください。
関連情報
古い情報を見つけましたか? 訂正を連絡