ゲームラグ白書 › 一部のユーザーだけに起きる問題
オブジェクトIDの再利用による混同 Entity ID reused without a generation counter
原因ID pt-id-reuse · 主担当 ゲーム開発チーム・サーバー開発 · 副担当 ゲーム開発チーム・クライアント開発
図と実験のあるメインページでこのカードを開く →
倒されたNPCが再び出現するときにサーバーが同じオブジェクトIDを使い回すと、その間に消滅通知を取りこぼしたクライアントは、新しいNPCを古いNPCと誤認します。
なぜ NPCが倒され、同じオブジェクトIDで再出現 → すると 消滅通知を取りこぼしたクライアントは「すでに知っているオブジェクト」として出現通知を無視するか、死亡状態のまま残す → 画面では 片方の画面にだけNPCがいないか倒れたまま見える、別のNPCの姿で見えることもある
- 症状
- 表示されない・ゴースト
- 要因
- パケットロス
- 誰に起きるか
- 同じPCの片方のクライアントだけ, 自分だけ
- いつ
- ときどきランダムに, 人が集中したとき
- 担当
- 主担当 ゲーム開発チーム・サーバー開発 · 副担当 ゲーム開発チーム・クライアント開発
- ゲーム開発チームの対応
- サーバー:オブジェクトIDに世代番号を付けて再利用を区別。クライアント:すでに知っているIDの出現通知を受け取ったら、既存のオブジェクトを削除して新たに作る。
- グラフでは
- 不定期なスパイク · すでに知っているIDの出現通知の数
- 確認箇所
- サーバーに、オブジェクトIDごとの生成・削除時刻(世代番号があれば一緒に)を記録し、クライアントがすでに知っているIDで出現通知を受け取った回数と、視界更新時に「変化なし」として処理された削除・再生成を数える
- 該当する場合
- 表示されないか倒れたまま見えるNPCのIDが直前に倒されたNPCと同じで、その間にそのクライアントが消滅通知を受け取れていないか、サーバーが消滅・出現の通知をどちらも送っていない
- 該当しない場合
- IDに世代番号があり、比較にも使っているなら、この原因ではない。再利用されたIDでないのに表示されないなら、出現通知の欠落側
- 確認手段
- ゲームサーバー・クライアントのログ・メトリクスが必要
- もっと詳しく
- サーバー側でも起きます。視界内のオブジェクトリストをIDだけで比較すると、2回の視界更新の間に倒されて同じIDで再スポーンしたNPCを「変化なし」とみなし、消滅・出現の通知をどちらも送りません。視界更新のタイミングが人ごとにずれていると、その瞬間に当たったクライアントだけがこの問題に遭います。
出典
- Entity struct (Entities 1.3) Unity
EntityはIndexと世代番号(Version)で構成され、再利用されたIndexがまだ有効かを区別 - NetworkConfig class (Netcode for GameObjects 2.5) Unity
RecycleNetworkIds・NetworkIdRecycleDelay:ネットワークIDを一定時間空けてから再利用
あわせて読みたい原因
同じ層:一部のユーザーだけに起きる問題
同じ症状(表示されない・ゴースト)を起こすほかの層の原因
図と実験のあるメインページでこのカードを見る