游戏卡顿白皮书 › 只有部分人遇到的问题
基准快照丢失 Lost baseline for delta compression
原因 ID pt-baseline · 主责 研发团队·服务器开发 · 配合 研发团队·客户端开发
在含图示和实验的完整版中打开此卡片 →
在服务器只发“与上次相比变化的部分”的方式下,丢了最初那一份完整信息(基准),之后的变化量就没法应用。
起因 实体的完整信息(基准)包丢失,或在处理前被丢弃 → 结果 客户端没有可以应用后续变化量的对象,于是忽略 → 画面表现 这个实体看不到,或过了很久突然出现
- 症状
- 隐身/幽灵实体, 瞬移
- 因素
- 丢包
- 谁会遇到
- 双开时只有一个客户端, 只有我
- 何时出现
- 偶尔随机
- 负责方
- 主责 研发团队·服务器开发 · 配合 研发团队·客户端开发
- 研发团队要做的事
- 服务器:基准在收到确认(ACK)之前必须重传,变化量只针对客户端已确认收到的基准生成。客户端:基准真正应用之后再发送确认(ACK),收到未知实体的变化量时向服务器重新请求。
- 监控图上
- 偶发随机尖峰 · 收到未知实体变化量的次数
- 查看位置
- 把客户端因没有基准而丢弃变化量的次数和实体 ID,与服务器发送该实体基准的时刻、收到 ACK 的时刻对照。在开发环境中加入丢包(tc netem 的 loss、Unreal 网络模拟的丢包比例)来复现
- 确认依据
- 对看不到的实体,服务器发过基准但没收到 ACK,却一直只发变化量,客户端把这些变化量丢弃了
- 排除依据
- 基准已收到 ACK 并在客户端应用,却仍然看不到,看“离开通知丢失(幽灵实体)”或“实体 ID 重用混淆”
- 确认手段
- 需要游戏服务器/客户端的日志和指标
出处
- Snapshot Compression Gaffer On Games
变化量只能针对对方已确认(ack)收到的基准(baseline)生成,初始状态单独发送 - Quake III Arena source: code/server/sv_snapshot.c id Software
以客户端已确认的快照为基准做增量压缩,基准太旧时发送完整快照 - tc-netem(8) — Linux manual page iproute2
给发出的数据包加入延迟、抖动(delay TIME JITTER)和丢包(loss random PERCENT),模拟真实网络的测试工具 - Using Network Emulation in Unreal Engine Epic Games
在服务器、客户端上加入最小/最大延迟和丢包比例做测试,控制台中用 NetEmulation.PktLag 这类命令设置
相关原因
同一层:只有部分人遇到的问题
其他层中同样导致“隐身/幽灵实体”的原因
查看含图示和实验的原卡片