ゲームラグ白書 › L1 クライアントのゲームプロセス
クライアントサイド予測の不一致 Prediction mismatch / reconciliation
原因ID cg-predict · 主担当 ゲーム開発チーム・クライアント開発 · 副担当 ゲーム開発チーム・サーバー開発
図と実験のあるメインページでこのカードを開く →
自分のクライアントが先に動かして見せたのに、サーバーの計算結果が違うと、自分のキャラクターが引き戻されます。
なぜ クライアントがサーバーの確認前に先に動く(予測) → すると サーバーが衝突・移動速度・バフを違う形で計算するか、コマンドを受け取れない → 画面では 確認が届いたとき、自分のキャラクターが後ろへ引き戻される
- 症状
- 引き戻し
- 要因
- パケットロス, 遅延
- 誰に起きるか
- 自分だけ
- いつ
- 移動中・マップ切り替え時, ときどきランダムに
- 担当
- 主担当 ゲーム開発チーム・クライアント開発 · 副担当 ゲーム開発チーム・サーバー開発
- ゲーム開発チームの対応
- クライアント:サーバーと同じ移動コードを使用、入力の重複送信、補正は滑らかに。サーバー:クライアントと同じ移動コードを使用、重複して届いた入力は入力番号で除外して1回だけ処理。
- 数値の目安
- 引き戻される距離は「ずれた時間 × 移動速度」。コマンドがいくつか消えるだけで1〜3m。
- グラフでは
- 不定期なスパイク · サーバー補正(予測ミス)の回数
- 確認箇所
- サーバーが送った位置補正の回数と補正距離を記録。UnrealではサーバーのClientAdjustPositionによる補正、UnityのNetcode for Entitiesでは予測ミスで巻き戻して再計算した回数を数える
- 該当する場合
- 引き戻しの報告時刻に補正が集中し、特定のバフ・地形・移動スキルで補正距離が繰り返し大きくなる
- 該当しない場合
- 補正がパケットロスの多いときにだけ集中するなら、入力パケットのロス(回線)側。補正がないのに他のキャラクターだけ引き戻されて見えるなら「過度な外挿(デッドレコニング)」
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
出典
- Introduction to prediction (Netcode for Entities 6.5) Unity
クライアントとサーバーが同じシミュレーションコードで予測し、サーバーの状態と異なれば(予測ミス)巻き戻して再計算するため、補正が目に見える - Use the command stream to handle user inputs (Netcode for Entities 6.5) Unity
パケットロスに備え、最新の入力と一緒に直前数ティック分の入力を重複して送る - Understanding Networked Movement in the Character Movement Component for Unreal Engine Epic Games
クライアントが先に動き、サーバーが同じ移動を再現。位置が異なればClientAdjustPositionで補正し、保存しておいた移動を再適用
あわせて読みたい原因
同じ層:L1 クライアントのゲームプロセス
同じ症状(引き戻し)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る