ゲームラグ白書 › 同期設計
ロックステップでの最も遅いプレイヤー待ち Lockstep waits for the slowest peer
原因ID sy-lockstep · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
全員が同じターンを一緒に計算する構造では、1人の入力が遅れると全員が待たされます。
なぜ ターンごとに全プレイヤーの入力がそろわないと計算できない → すると 1人の入力がジッター・パケットロスで遅れて到着 → 画面では 全員が同時に一瞬止まり、ひどいと「プレイヤーを待っています」ウィンドウ
- 症状
- フリーズ, カクつき, 入力遅延
- 要因
- ジッター, パケットロス, ストール
- 誰に起きるか
- 特定の場所・チャンネル
- いつ
- ときどきランダムに
- 担当
- 主担当 ゲーム開発チーム・サーバー開発 · 副担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- サーバー:入力遅延をPingに合わせて自動調整、遅れている人だけを一時的に切り離し、残りは待たずに進行。クライアント:決められた入力遅延を適用、中継サーバーのないP2Pなら、入力遅延の調整と遅れている人の処理もホストのクライアントが担う。
- 数値の目安
- 入力遅延を「入力が相手に届く時間 + ジッター」より短く設定すると、停止が頻発します。届く時間は、直接やり取りするならPingの半分、中継サーバーを経由するなら2人のPingを足した値の半分ほどです。
- グラフでは
- 不定期なスパイク · ターンの待ち時間、プレイヤーごとの入力到着の遅れ
- 確認箇所
- ターンごとにプレイヤー別の入力到着時刻と、ターンが止まって待った時間を記録し、止まったターンで誰の入力を待っていたかを確認。中継サーバーがあれば、サーバー側のパケットキャプチャでプレイヤー別の入力パケットの到着間隔からも確認できる
- 該当する場合
- 止まったターンのたびに同じ1人の入力が入力遅延より遅れて到着しており、その時刻にその人のジッター・パケットロスが跳ねている
- 該当しない場合
- 入力はすべて時間どおりに届いているのに止まるなら、最も遅いPCの計算時間かサーバー処理の問題。止まらずに2つの画面の結果だけが食い違うなら計算結果のずれ(desync)なので、コマンド同期の経路計算の不一致を確認
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
出典
- Deterministic Lockstep Gaffer On Games
フレームnの入力がすべて届かないと計算できないため、遅れると待つ。ジッターを吸収する再生遅延バッファが小さいと一瞬止まる - 1500 Archers on a 28.8: Network Programming in Age of Empires and Beyond Game Developer
コマンドを2ターン後に実行するよう予約し、最も遅いコンピューターとPingに合わせてターンの長さを調整(Speed Control) - A Survey and Taxonomy of Latency Compensation Techniques for Network Computer Games (ACM Computing Surveys, 2022) ACM
入力遅延(incoming delay)を「A→サーバー + サーバー→B」の遅延の分だけ設け、全員が同じ瞬間に適用
あわせて読みたい原因
同じ層:同期設計
同じ症状(フリーズ)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る