ゲームラグ白書 › 一部のユーザーだけに起きる問題
基準スナップショットの欠落 Lost baseline for delta compression
原因ID pt-baseline · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
サーバーが「前回から変わったものだけ」を送る方式では、最初に1回送る全体の情報(基準)を失うと、その後の差分を適用できません。
なぜ オブジェクトの全体情報(基準)のパケットが失われるか、処理前に破棄される → すると クライアントはその後の差分を適用する対象がないため無視 → 画面では そのオブジェクトが表示されないか、かなり後で突然現れる
- 症状
- 表示されない・ゴースト, ワープ
- 要因
- パケットロス
- 誰に起きるか
- 同じPCの片方のクライアントだけ, 自分だけ
- いつ
- ときどきランダムに
- 担当
- 主担当 ゲーム開発チーム・サーバー開発 · 副担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- サーバー:基準は受信確認(ACK)を受け取るまで必ず再送、差分はクライアントが受信を確認した基準に対してだけ作る。クライアント:基準は実際に適用してから受信確認(ACK)を送る、知らないオブジェクトの差分を受け取ったらサーバーに再要求。
- グラフでは
- 不定期なスパイク · 知らないオブジェクトの差分の受信数
- 確認箇所
- クライアントが基準なしに受け取った差分を破棄した回数とオブジェクトIDを、サーバーがそのオブジェクトの基準を送った時刻・ACKを受け取った時刻と照合。開発環境でパケットロスを加えて(tc netemのloss、Unrealのネットワークエミュレーションのパケットロス率)再現
- 該当する場合
- 表示されないオブジェクトについて、サーバーは基準を送ったもののACKを受け取れていないのに差分だけを送り続け、クライアントはその差分を破棄している
- 該当しない場合
- 基準がACKまで受け取られてクライアントに適用されているのに表示されないなら、消滅通知の欠落かオブジェクトIDの再利用による混同
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
出典
- Snapshot Compression Gaffer On Games
差分は相手が受信を確認(ack)した基準(baseline)に対してだけ作る必要があり、初期状態は別に送る - Quake III Arena source: code/server/sv_snapshot.c id Software
クライアントが確認したスナップショットを基準にデルタ圧縮し、基準が古すぎればフルスナップショットを送る - tc-netem(8) — Linux manual page iproute2
送信パケットに遅延・ジッター(delay TIME JITTER)とパケットロス(loss random PERCENT)を加え、実際のネットワークを模倣する試験ツール - Using Network Emulation in Unreal Engine Epic Games
サーバー・クライアントに最小・最大の遅延とパケットロス率を設定して試験、コンソールではNetEmulation.PktLagのように設定
あわせて読みたい原因
同じ層:一部のユーザーだけに起きる問題
同じ症状(表示されない・ゴースト)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る