游戏卡顿白皮书 › 按症状查找
隐身/幽灵实体:20 个原因及负责方
又称:NPC 不见了、透明人、死掉的怪还站着
在含图示的完整版症状词典中打开 →
本该在的 NPC、怪物、玩家只在自己画面上看不到,或者已经消失的实体只在自己画面上还留着。
别人在和 NPC 对话,自己看到的却是一片空地。只有名字没有角色模型,或者站着一只怎么打都没反应的怪。
多半是少了某个数据包或者绘制失败,和快慢关系不大。排查分线或位面不同、出现和消失通知丢失、加载中被丢弃、资源加载失败。离开视野再回来能不能看到,是关键线索。
导致此症状的原因
L1 客户端游戏进程
- 存储设备过慢导致资源流式加载滞后: 在 HDD 这类慢速存储设备上,开放世界读取纹理、模型的速度跟不上移动,实体会晚出现,游戏也会因等待读取而一卡一卡。 (研发团队·客户端开发)
L8 Socket 与协议
- keepalive 默认 2 小时: 对方没发关闭信号就消失时,TCP 要过很久才能发现。keepalive(确认空闲连接是否还活着的 TCP 功能)默认关闭,开了也要空闲 2 小时才开始确认。 (研发团队·服务器开发)
- 空闲后的慢启动: TCP 空闲一段时间后会重新缩小拥塞窗口(一次能发送的量),突然要发大量数据时只能分几次发。 (运维团队·系统运维)
只有部分人遇到的问题
- 分线/副本/位面不同: 两个角色在不同的分线或副本里,或者处在按任务进度显示不同 NPC 的不同“位面”时,看到的就是不同的世界。 (研发团队·服务器开发)
- 加载中到达的出现通知被丢弃: 刚进入场景,服务器就发来周围 NPC 的出现通知,而客户端还在加载地图,就把这些通知丢掉了。 (研发团队·客户端开发)
- 视野注册顺序错乱: 角色注册到视野网格的时刻与 NPC 跨网格移动的时刻重合时,这个 NPC 的出现通知可能会漏掉。 (研发团队·服务器开发)
- 基准快照丢失: 在服务器只发“与上次相比变化的部分”的方式下,丢了最初那一份完整信息(基准),之后的变化量就没法应用。 (研发团队·服务器开发)
- 离开通知丢失(幽灵实体): 反过来,漏掉“已消失”的通知时,已经死亡或离开的 NPC、玩家只会留在自己的画面上。 (研发团队·服务器开发)
- 刚进入时集中到达的出现信息丢失: 进入场景的那一刻,服务器会一次性发出周围几十到几百个实体的出现信息。如果用不可靠(unreliable)通道发送,或者客户端在加载中读不了 socket、接收缓冲区溢出,就会丢掉一部分,而且不会再来。 (研发团队·服务器开发)
- 实体 ID 重用混淆: 死掉的 NPC 重新出现时,如果服务器重用同一个实体 ID,期间漏掉离开通知的客户端会把新 NPC 误认成旧 NPC。 (研发团队·服务器开发)
- 固定 UDP 端口冲突: 客户端被做成使用固定的本地端口时,同一台电脑上的第二个客户端要么用不了这个端口,要么和第一个客户端分着收包。 (研发团队·客户端开发)
- 按 IP/设备区分会话的 bug: 服务器或中间服务器按 IP 或设备 ID 区分连接时,会把同一台电脑(同一公网 IP)上的两个客户端认成同一个人。 (研发团队·服务器开发)
- 多开限制: 安全模块或服务器策略限制一台电脑上开多个客户端时,第二个客户端会无法启动或连接,或者先开的那个掉线。有些游戏只禁用额外客户端的部分功能。 (研发团队·客户端开发)
- 后台窗口处理受限: 处于后台窗口的客户端,游戏、引擎、OS 都会减少它的帧和处理量。收到的包不能及时处理,就会积压或溢出。 (研发团队·客户端开发)
- 缓存/资源文件并发访问冲突: 两个客户端同时写同一个缓存文件夹或锁住文件时,其中一个会加载不了 NPC 模型、纹理。 (研发团队·客户端开发)
- 内存/显存不足导致流式加载失败: 两个客户端共用显存时,新需要的模型、纹理没有地方加载,有一部分就画不出来。 (研发团队·客户端开发)
- 显示选项不同: 显示人数限制、隐藏 NPC 名字牌或模型、低配模式这类选项在两个客户端上不同时,看到的东西就不一样。 (研发团队·客户端开发)
- 客户端版本/数据不一致: 第二个客户端来自另一个安装目录,或补丁没打完时,它不认识服务器发来的新 NPC ID,就会悄悄忽略。 (研发团队·客户端开发)
- 按连接分配的发送预算/优先级: 服务器给每个连接的发送量设上限、按由近及远的顺序发送时,上限定得低的一方收到远处 NPC 会很晚,甚至收不到。 (研发团队·服务器开发)
- 时钟估算误差导致实体被搁置: 客户端估算的服务器时间不准时,刚到达的实体信息会被当成“还在未来”而搁置,或被当成“太旧”而丢弃。 (研发团队·客户端开发)
查看含图示的完整版症状词典