한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

ゲームラグ白書 › 一部のユーザーだけに起きる問題

オブジェクト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を「変化なし」とみなし、消滅・出現の通知をどちらも送りません。視界更新のタイミングが人ごとにずれていると、その瞬間に当たったクライアントだけがこの問題に遭います。

出典

  1. Entity struct (Entities 1.3) Unity
    EntityはIndexと世代番号(Version)で構成され、再利用されたIndexがまだ有効かを区別
  2. NetworkConfig class (Netcode for GameObjects 2.5) Unity
    RecycleNetworkIds・NetworkIdRecycleDelay:ネットワークIDを一定時間空けてから再利用

あわせて読みたい原因

同じ層:一部のユーザーだけに起きる問題

同じ症状(表示されない・ゴースト)を起こすほかの層の原因

図と実験のあるメインページでこのカードを見る