ゲームラグ白書 › 同期設計
ロールバックネットコードの予測失敗 Rollback misprediction
原因ID sy-rollback · 主担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
相手の入力を予測して先に見せ、外れたら巻き戻して計算し直します。Pingが大きいほど巻き戻す幅が大きくなります。
なぜ 相手が入力を変える(予測と違う) → すると 実際の入力がPingの半分だけ遅れて届き、その分を巻き戻して再計算 → 画面では 相手の動きが数フレーム飛んだり、急に変わったりする
- 症状
- ワープ
- 要因
- 遅延, ジッター
- 誰に起きるか
- 自分だけ
- いつ
- 特定の操作をしたとき, ときどきランダムに
- 担当
- 主担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- 入力遅延を1〜3フレーム組み合わせて巻き戻し幅を減らす、巻き戻しの上限を設ける。
- 数値の目安
- Ping 100ms(片道50ms)なら、60fpsで約3フレーム巻き戻します。入力遅延を2フレーム設けると1フレームに減ります。
- グラフでは
- 不定期なスパイク · 巻き戻したフレーム数、RTT(Ping)
- 確認箇所
- クライアントが巻き戻しのたびに、巻き戻したフレーム数、その時のRTT、入力遅延の設定、巻き戻し・再計算にかかった時間を記録
- 該当する場合
- 相手の動きが飛んだという瞬間に巻き戻したフレーム数が大きく、平均の巻き戻し幅がおおよそ(片道遅延 − 入力遅延)÷ フレーム時間で、Pingが大きいほど大きくなる
- 該当しない場合
- 巻き戻し幅が小さいのにカクつきが起きるなら、再計算が1フレームの時間を超える性能の問題。巻き戻した後も2つの画面の結果が食い違い続けるなら計算結果のずれ(desync)
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
出典
- GGPO Rollback Networking SDK GGPO
相手の入力を予測して先に進め、実際の入力が違えば、ずれた時点から現在までを計算し直す - 8 Frames in 16ms: Rollback Networking in 'Mortal Kombat' and 'Injustice 2' GDC
ロールバックでロックステップのローカル入力遅延をなくし、16ms以内に最大8フレームを巻き戻して再計算
あわせて読みたい原因
同じ層:同期設計
同じ症状(ワープ)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る