ゲームラグ白書 › 一部のユーザーだけに起きる問題
回線が重い人がほかの人の画面でまとめて動く Laggy player seen by others (bursty inputs)
原因ID pt-slow-burst · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 外部・外部
図と実験のあるメインページでこのカードを開く →
回線が悪い人の入力は、不規則にまとまってサーバーに届きます。サーバーがティックごとに受け取った分だけ適用すると、ほかの人の目にはそのキャラクターが一瞬止まってから一気に何歩も進んで見えます。
なぜ 回線が重い人の移動コマンドが、あるティックには0個、あるティックには2〜3個ずつ届く → すると サーバーが受け取ったティックに一度に適用するため、そのキャラクターの位置が階段状に変わる → 画面では ほかの人の画面でそのキャラクターだけが一瞬止まっては一気にまとめて移動。ほかは問題なし
- 症状
- 早送り, ワープ
- 要因
- ジッター, パケットロス
- 誰に起きるか
- 特定のキャラだけおかしく見える, 特定の地域・ISP
- いつ
- 常に, 移動中・マップ切り替え時
- 担当
- 主担当 ゲーム開発チーム・サーバー開発 · 副担当 外部・外部
- ゲーム開発チームの対応
- プレイヤーごとの入力バッファでコマンドを均等に分けて適用、入力のシーケンス番号を見て元の間隔どおりに適用、ほかの人の画面の補間バッファを増やすだけでは不十分(サーバーでの位置の記録自体が階段状になっているため)。
- 外部の対応
- 回線が重いユーザーに、有線接続、Wi-Fi・ルーターの点検を案内。
- 数値の目安
- ジッターが80msなら、20ティック(50ms)のサーバーでティックあたりのコマンド数が0〜3個でばらつきます。
- グラフでは
- 一部だけ高い · プレイヤーごとのティックあたり適用コマンド数、プレイヤーごとのジッター
- 確認箇所
- サーバー側のパケットキャプチャで、報告されたユーザーが送ったパケットだけに絞り、ティック間隔(例:50ms)ごとに何個ずつ届いたかを数えてほかのユーザーと比較。サーバーログがあれば、プレイヤーごと・ティックごとに適用した移動コマンド数と入力のシーケンス番号を確認
- 該当する場合
- 報告されたユーザーのパケットだけがティックごとに0個と2〜3個を行き来してまとまって届き、そのユーザーのジッター・パケットロスが高く、ほかのユーザーのパケットは均等に届いている。そのユーザーが有線に切り替えると減る
- 該当しない場合
- 複数のキャラクターが一斉にまとめて動くなら、サーバーのティック遅延か見ている人側の回線。到着と適用が均等なのにそのキャラクターだけ飛んで見えるなら、見ている側の補間・表示の問題
- 確認手段
- インフラのツールで確認(ゲームコード不要)
- もっと詳しく
- サーバー権威型の構成では、これは正常な動作です。回線が重い1人のラグは、ほかの人には「その人がおかしな動きをする姿」としてだけ見え、ほかの人の操作やモンスターの動きには影響しません。ただし、その人と直接やり取りすること(取引、パーティでのギミック、PvPの判定)は一緒に遅れます。
出典
- Peeking into VALORANT's Netcode Riot Games
サーバーはプレイヤーごとの移動キューに届いた入力をティック順に入れ、空になれば予測で埋める。補正はそのプレイヤーにだけ見え、ほかの人にはなめらかに見える - State Synchronization Gaffer On Games
毎秒60回送ったパケットでも、あるフレームに2個、次のフレームに0個のようにまとまって届く - Source SDK 2013: player.cpp Valve
まとまって届いたコマンドをサーバーのティックに分けて処理(meter out)
あわせて読みたい原因
同じ層:一部のユーザーだけに起きる問題
同じ症状(早送り)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る