游戏卡顿白皮书 › L1 客户端游戏进程
没有插值缓冲或缓冲过短 Missing/short interpolation buffer
原因 ID cg-no-buffer · 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
收到服务器数据包就立刻绘制,抖动(到达间隔的波动)会原样暴露在画面上。
起因 收到的位置直接绘制,或缓冲比抖动短 → 结果 数据包晚到多久就停多久,扎堆到达就跳一下 → 画面表现 其他角色一顿一顿地移动
- 症状
- 一卡一卡
- 因素
- 抖动
- 谁会遇到
- 只有我
- 何时出现
- 一直
- 负责方
- 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
- 研发团队要做的事
- 客户端:设置插值缓冲,并根据线路状况自动调节缓冲长度。服务器:采用延迟补偿(回溯判定),让玩家对着缓冲时长之前的画面射击也能正确判定。
- 数值参考
- 通常把服务器发包间隔的 2 倍左右(每秒收 20 次就是 100 ms)作为缓冲。
- 监控图上
- 一直偏高 · 数据包到达间隔、插值缓冲被取空的次数
- 查看位置
- 在客户端记录服务器数据包到达间隔的分布,以及因为没有下一张可插值的快照而停住或转为外推的帧数
- 确认依据
- 到达间隔的波动经常超过插值缓冲长度,每次缓冲被取空,其他角色就顿一下。加大缓冲后减少
- 排除依据
- 缓冲足够仍然顿一下,检查服务器的发送间隔本身是否不规律(tick 延迟)
- 确认手段
- 需要游戏服务器/客户端的日志和指标
- 深入了解
- 缓冲加大后画面更平滑,但看到的对手也相应是过去的样子。所以攻击判定要配合延迟补偿:服务器回溯到“那个人当时看到的过去”再确认。
出处
- Interpolation and extrapolation (Netcode for Entities 6.5) Unity
缓冲插值:为等待晚到的数据包故意延后绘制;缓冲越大越准确,但延迟也随之增加 - Struct ClientTickRate (Netcode for Entities 6.5) Unity
插值缓冲默认值 InterpolationTimeNetTicks = 2(服务器发送 2 次的量) - Physics (Netcode for Entities 6.5) Unity
延迟补偿:服务器找出客户端在那个 tick 看到的碰撞世界,据此判定是否命中
相关原因
同一层:L1 客户端游戏进程
其他层中同样导致“一卡一卡”的原因
查看含图示和实验的原卡片