한국어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 倒地不起,有时还显示成别的 NPC 的样子

症状
隐身/幽灵实体
因素
丢包
谁会遇到
双开时只有一个客户端, 只有我
何时出现
偶尔随机, 人多的时候
负责方
主责 研发团队·服务器开发 · 配合 研发团队·客户端开发
研发团队要做的事
服务器:给实体 ID 加上代数编号(generation),以区分重用。客户端:收到已知 ID 的出现通知时,删除原有实体后重新创建。
监控图上
偶发随机尖峰 · 已知 ID 的出现通知数
查看位置
在服务器上记录各实体 ID 的创建、删除时刻(如有代数编号,一并记录),统计客户端以已知 ID 收到出现通知的次数,以及视野更新时被当作“没有变化”处理的删除后重新生成
确认依据
看不到或倒地显示的 NPC,其 ID 与刚死亡的 NPC 相同,期间该客户端没收到离开通知,或服务器离开、出现通知都没发
排除依据
ID 带有代数编号且比较时也用到了,就不是这个原因。ID 没有被重用却仍看不到,是出现通知丢失方面的问题
确认手段
需要游戏服务器/客户端的日志和指标
深入了解
服务器侧也会发生。只按 ID 比较视野内实体列表时,在两次视野更新之间死亡并以同一 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 空置一段时间后再重用

相关原因

同一层:只有部分人遇到的问题

其他层中同样导致“隐身/幽灵实体”的原因

查看含图示和实验的原卡片