ゲームラグ白書 › L1 クライアントのゲームプロセス
固定タイムステップの追いつき処理の暴走 Fixed-timestep catch-up / spiral of death
原因ID cg-fixed-step · 主担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
一度止まった後、遅れた計算をまとめて処理しようとして、その計算のせいでさらに遅れます。
なぜ ゲームのシミュレーションを固定間隔で回している最中に、一度止まる → すると 遅れたステップを1フレームでまとめて計算 → 画面では 長いフレームが次々と続いて跳ねるか、上限に達して世界全体がスローモーションになる
- 症状
- カクつき, 早送り, スローモーション
- 要因
- ストール
- 誰に起きるか
- 自分だけ
- いつ
- ときどきランダムに, 人が集中したとき
- 担当
- 主担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- フレームあたりの追いつき処理の上限、余った時間は補間で処理。
- グラフでは
- 不定期なスパイク · フレームタイム、フレームあたりの固定ステップ数
- 確認箇所
- 開発ビルドのプロファイラーで、1フレームに固定ステップが何回実行されたか(UnityではFixedBehaviourUpdateなどFixedUpdate段階のマーカー数)とフレームタイムをあわせて確認
- 該当する場合
- 長いフレーム1つの後に、ステップを何回も回す長いフレームが次々と続く。上限(UnityのMaximum Allowed Timestep)に達すると、ゲーム内の時間が実際より遅く流れる
- 該当しない場合
- 長いフレームが1回で終わるなら「フレームタイムのスパイク」か「クライアントのガベージコレクション」
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
- もっと詳しく
- Unityの物理演算(FixedUpdate)が代表的な固定ステップです(デフォルト0.02秒、1秒に50回)。Time設定のMaximum Allowed Timestep(1フレームで追いつく最大時間、デフォルト約0.33秒)が追いつき処理の上限です。1フレームがこれより長いと、あふれた時間は捨てられ、その分ゲームの時計が実際より遅れます。
出典
- Set fixed timestep to optimize physics simulation frequency Unity
Fixed Timestepのデフォルト値は0.02秒(1秒に50回)。フレームが長いと1フレームで物理ステップを何回も回すため負荷が増える - Handling variation in time Unity
Maximum Allowed Timestepのデフォルト値は1/3秒(0.3333333)。1秒止まってもゲーム内の時間は0.333秒しか進まない。追いつき処理のステップがさらに遅くなる悪循環を防ぐための上限 - Profiler markers reference Unity
FixedBehaviourUpdate:MonoBehaviour.FixedUpdateの実行区間。物理のマーカーはFixedUpdate段階で呼ばれる
あわせて読みたい原因
同じ層:L1 クライアントのゲームプロセス
同じ症状(カクつき)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る