ゲームラグ白書 › 一部のユーザーだけに起きる問題
プレイヤーごとの入力バッファのサイズ Per-player server input buffer (jitter buffer)
原因ID pt-input-buffer · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
サーバーが人ごとに入力を少しためておき、1ティックに1つずつ取り出して使うと、ほかの人の目にはなめらかですが、本人の行動がサーバーで確定するタイミングはその分遅れます。
なぜ サーバーが回線の重い人の入力をバッファにため、1ティックに1つずつ適用 → すると バッファが小さいと頻繁に空になり、そのキャラクターがその場に止まるか、サーバーが最後の入力から推測して動かす。大きいと本人の入力の確定が遅れる → 画面では 小さいとほかの人の目には一瞬止まって見え、大きいと本人のスキルの結果が遅れて出る(入力遅延)
- 症状
- カクつき, 入力遅延
- 要因
- ジッター
- 誰に起きるか
- 特定のキャラだけおかしく見える, 自分だけ
- いつ
- 常に
- 担当
- 主担当 ゲーム開発チーム・サーバー開発 · 副担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- サーバー:人ごとに回線の状態に合わせてバッファサイズを自動調整、遅れたら2つずつ取り出して追いつく、バッファが頻繁に空になる人のクライアントには入力を早めに送るよう指示。クライアント:サーバーの指示に合わせて入力を少し早めに送る(クライアントの時間調整)。
- 数値の目安
- ゲームによって違いますが、通常は1〜3ティック分です。VALORANTは128ティックのサーバーで、サーバー側のバッファを平均半フレーム(約4ms)と、さらに短く保っています。ジッターが大きい人だけバッファを増やす適応型が一般的です。
- グラフでは
- 一部だけ高い · プレイヤーごとの入力バッファの長さ・空になった回数
- 確認箇所
- サーバーに、プレイヤーごと・ティックごとに入力バッファに残っている入力数、バッファが空になって最後の入力から推測して埋めた回数、入力の到着から適用までにかかった時間を記録
- 該当する場合
- バッファが小さい人は空になる回数が多く、その瞬間にほかの人の画面で短く止まる。バッファが大きい人は、入力から適用までの時間がバッファの長さの分だけ延びている
- 該当しない場合
- バッファがほとんど空にならないのにほかの人の画面でカクつきが見えるなら、見ている側の補間の問題。バッファが短いのに入力遅延が大きいなら、RTTそのものか二重のティック待ち
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
出典
- Peeking into VALORANT's Netcode Riot Games
サーバーがクライアントの時間基準を調整し、入力キューを、遅延が最小でありながら不規則な到着を吸収できる分だけに保つ。サーバーのバッファリングの目標は平均半フレーム - NetworkTimeSystem class (Netcode for GameObjects 2.5) Unity
LocalBufferSec:サーバーがクライアントのメッセージをバッファリングする時間。クライアントの時間を早めることで、メッセージがサーバーにより早く届く - NetworkTime and ticks (Netcode for GameObjects 2.5) Unity
回線が悪いプレイヤーはバッファの値を増やせる
あわせて読みたい原因
同じ層:一部のユーザーだけに起きる問題
同じ症状(カクつき)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る