ゲームラグ白書 › 同期設計
ラグコンペンセーションのない判定 Server-now hit validation
原因ID sy-no-lagcomp · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
サーバーが「今のサーバー上の位置」だけで命中を判定すると、自分が見た画面と判定が食い違います。
なぜ 自分の画面の相手は約0.2秒前の位置(Ping 150ms、補間100msの場合) → すると サーバーは現在位置で判定するため、自分が狙った場所にはもういない → 画面では 確かに当てたのに外れる。動く対象には偏差撃ちが必要
- 症状
- 不発・ロールバック
- 要因
- 遅延
- 誰に起きるか
- 自分だけ
- いつ
- 特定の操作をしたとき
- 担当
- 主担当 ゲーム開発チーム・サーバー開発 · 副担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- サーバー:攻撃者が見ていた時点に巻き戻して判定(ラグコンペンセーション)、またはターゲット指定方式に変更。クライアント:攻撃時に自分が見ていた時点(補間中のサーバー時刻)も一緒に送る。
- グラフでは
- 一部だけ高い · 動く対象への命中率(Ping帯別)
- 確認箇所
- サーバーの判定ログに、攻撃時刻、攻撃者の画面上の対象位置(クライアントが送った値)、判定に使ったサーバー上の対象位置、攻撃者のRTTを一緒に記録。開発ビルドでサーバーが判定に使った位置をクライアント画面に重ねて描くと、すぐにわかる
- 該当する場合
- 外れた判定での2つの位置の差がおおよそ対象の速度 ×(攻撃者のRTT + 補間時間)で、Pingが高いほど動く対象の命中率だけが下がる
- 該当しない場合
- 止まっている対象にも外れるなら、ヒットボックス・衝突判定の問題。巻き戻しをしているのに食い違うなら、クライアントが補間時間をサーバーに誤って伝えていないかを確認
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
出典
- Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve
ラグコンペンセーションがないと、遅延の分だけ偏差撃ちが必要。サーバーが遅延と補間時間の分だけ巻き戻して判定するラグコンペンセーション - Peeking into VALORANT's Netcode Riot Games
サーバーが射撃の瞬間にプレイヤーが見ていたゲーム状態へ巻き戻して命中を判定、クライアントは見ていたシミュレーション時刻も一緒に送る - Source SDK 2013: player_lagcompensation.cpp Valve
Sourceエンジンの巻き戻し時間 = ネットワーク遅延 + 補間時間
あわせて読みたい原因
同じ層:同期設計
同じ症状(不発・ロールバック)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る