ゲームラグ白書 › L1 クライアントのゲームプロセス
補間バッファがないか短い Missing/short interpolation buffer
原因ID cg-no-buffer · 主担当 ゲーム開発チーム・クライアント開発 · 副担当 ゲーム開発チーム・サーバー開発
図と実験のあるメインページでこのカードを開く →
サーバーのパケットを受け取ってすぐ描画すると、ジッター(到着間隔のばらつき)がそのまま画面に表れます。
なぜ 受信した位置をすぐに描画するか、バッファがジッターより短い → すると 遅れて届いたパケットの分だけ止まり、まとめて届いたパケットの分だけ跳ぶ → 画面では 他のキャラクターの動きがカクつく
- 症状
- カクつき
- 要因
- ジッター
- 誰に起きるか
- 自分だけ
- いつ
- 常に
- 担当
- 主担当 ゲーム開発チーム・クライアント開発 · 副担当 ゲーム開発チーム・サーバー開発
- ゲーム開発チームの対応
- クライアント:補間バッファを設け、回線の状態に応じてバッファの長さを自動調整。サーバー:バッファの分だけ過去の姿を見て撃っても判定が合うよう、ラグコンペンセーション(巻き戻し判定)を適用。
- 数値の目安
- 通常、サーバーがパケットを送る間隔の2倍程度(1秒に20回受信するなら100ms)をバッファとして持ちます。
- グラフでは
- 最初から常に高い · パケットの到着間隔、補間バッファが空になった回数
- 確認箇所
- クライアントで、サーバーパケットの到着間隔の分布と、補間する次のスナップショットがなくて止まったり外挿に切り替わったりしたフレーム数を記録
- 該当する場合
- 到着間隔のばらつきが補間バッファの長さを超えることが多く、そのたびにバッファが空になって他のキャラクターが一瞬止まる。バッファを長くすると減る
- 該当しない場合
- バッファが十分なのに一瞬止まるなら、サーバーの送信間隔そのものが不規則でないか(ティックの遅延)を確認
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
- もっと詳しく
- バッファを長くすると滑らかになりますが、その分だけ相手の過去の姿を見ることになります。そのため攻撃の当たり判定では、サーバーが「その人が見ていた過去」まで巻き戻して確認するラグコンペンセーションを併用します。
出典
- Interpolation and extrapolation (Netcode for Entities 6.5) Unity
遅れて届くパケットを待つためにわざと遅らせて描画するバッファ補間。バッファが大きいほど正確だが、その分遅延が増える - Struct ClientTickRate (Netcode for Entities 6.5) Unity
補間バッファのデフォルト値はInterpolationTimeNetTicks = 2(サーバーの送信2回分) - Physics (Netcode for Entities 6.5) Unity
ラグコンペンセーション:クライアントがそのティックで見ていた衝突判定用のワールドをサーバーが探し、命中したかどうかを判定
あわせて読みたい原因
同じ層:L1 クライアントのゲームプロセス
同じ症状(カクつき)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る