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

游戏卡顿白皮书 › 只有部分人遇到的问题

基准快照丢失 Lost baseline for delta compression

原因 ID pt-baseline · 主责 研发团队·服务器开发 · 配合 研发团队·客户端开发

在含图示和实验的完整版中打开此卡片 →

在服务器只发“与上次相比变化的部分”的方式下,丢了最初那一份完整信息(基准),之后的变化量就没法应用。

起因 实体的完整信息(基准)包丢失,或在处理前被丢弃 → 结果 客户端没有可以应用后续变化量的对象,于是忽略 → 画面表现 这个实体看不到,或过了很久突然出现

症状
隐身/幽灵实体, 瞬移
因素
丢包
谁会遇到
双开时只有一个客户端, 只有我
何时出现
偶尔随机
负责方
主责 研发团队·服务器开发 · 配合 研发团队·客户端开发
研发团队要做的事
服务器:基准在收到确认(ACK)之前必须重传,变化量只针对客户端已确认收到的基准生成。客户端:基准真正应用之后再发送确认(ACK),收到未知实体的变化量时向服务器重新请求。
监控图上
偶发随机尖峰 · 收到未知实体变化量的次数
查看位置
把客户端因没有基准而丢弃变化量的次数和实体 ID,与服务器发送该实体基准的时刻、收到 ACK 的时刻对照。在开发环境中加入丢包(tc netem 的 loss、Unreal 网络模拟的丢包比例)来复现
确认依据
对看不到的实体,服务器发过基准但没收到 ACK,却一直只发变化量,客户端把这些变化量丢弃了
排除依据
基准已收到 ACK 并在客户端应用,却仍然看不到,看“离开通知丢失(幽灵实体)”或“实体 ID 重用混淆”
确认手段
需要游戏服务器/客户端的日志和指标

出处

  1. Snapshot Compression Gaffer On Games
    变化量只能针对对方已确认(ack)收到的基准(baseline)生成,初始状态单独发送
  2. Quake III Arena source: code/server/sv_snapshot.c id Software
    以客户端已确认的快照为基准做增量压缩,基准太旧时发送完整快照
  3. tc-netem(8) — Linux manual page iproute2
    给发出的数据包加入延迟、抖动(delay TIME JITTER)和丢包(loss random PERCENT),模拟真实网络的测试工具
  4. Using Network Emulation in Unreal Engine Epic Games
    在服务器、客户端上加入最小/最大延迟和丢包比例做测试,控制台中用 NetEmulation.PktLag 这类命令设置

相关原因

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

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

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