游戏卡顿白皮书 › 只有部分人遇到的问题
实体 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 会被当作“没有变化”,离开、出现通知都不发。每个人的视野更新时机错开时,只有恰好赶上那一刻的客户端会遇到。
出处
- Entity struct (Entities 1.3) Unity
Entity 由 Index 和代数编号(Version)组成,用来区分重用的 Index 是否仍然有效 - NetworkConfig class (Netcode for GameObjects 2.5) Unity
RecycleNetworkIds、NetworkIdRecycleDelay:网络 ID 空置一段时间后再重用
相关原因
同一层:只有部分人遇到的问题
其他层中同样导致“隐身/幽灵实体”的原因
查看含图示和实验的原卡片