游戏卡顿白皮书 › 同步设计
没有时间戳、一到就播放 Events played on arrival (no timestamps)
原因 ID sy-no-timestamp · 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
服务器事件不附带发生时刻、一收到就播放时,网络抖动会原封不动地让表现时机忽快忽慢。
起因 “开始攻击”“播放特效”事件一到就执行 → 结果 每个数据包到达时间不同,间隔忽长忽短 → 画面表现 连续攻击动作时快时慢,BOSS 技能时机每次都不一样
- 症状
- 一卡一卡, 快进
- 因素
- 抖动
- 谁会遇到
- 只有我
- 何时出现
- 一直
- 负责方
- 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
- 研发团队要做的事
- 客户端:按事件附带的时间播放(定时事件、插值缓冲)。服务器:给事件附上发生时刻(服务器时间)再发送。
- 监控图上
- 偶发随机尖峰 · 事件播放间隔,数据包到达间隔
- 查看位置
- 把服务器日志中的事件发生时刻与客户端日志中的到达、播放时刻按事件编号对齐,比较间隔。在开发版本中加入抖动(tc netem 的抖动值、Unreal 网络模拟的最小/最大延迟)来复现
- 确认依据
- 服务器上的发生间隔均匀,播放间隔却原样跟着到达间隔忽长忽短
- 排除依据
- 到达间隔均匀,播放却忽快忽慢,是客户端帧的问题(帧耗时尖峰)。服务器上的发生间隔就已经在波动,则是 tick 超出预算
- 确认手段
- 需要游戏服务器/客户端的日志和指标
出处
- Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve
每次更新都附上服务器时间,按当前时间减去插值时间(100 ms)得到的目标时刻的位置绘制 - Snapshot Interpolation Gaffer On Games
收到快照就立即绘制,会因抖动而一卡一卡;先在插值缓冲里攒一会儿再绘制,就很流畅 - NetworkTime and ticks (Netcode for GameObjects 2.5) Unity
在 RPC 中放入发送时刻,接收方按服务器时间播放效果的示例 - tc-netem(8) — Linux manual page iproute2
给发出的数据包加入延迟、抖动(delay TIME JITTER)和丢包(loss random PERCENT),模拟真实网络的测试工具 - Using Network Emulation in Unreal Engine Epic Games
在服务器、客户端上加入最小/最大延迟和丢包比例做测试,控制台中用 NetEmulation.PktLag 这类命令设置
相关原因
同一层:同步设计
其他层中同样导致“一卡一卡”的原因
查看含图示和实验的原卡片