游戏卡顿白皮书 › L1 客户端游戏进程
时钟同步误差 Clock sync error
原因 ID cg-clock · 主责 研发团队·客户端开发
在含图示和实验的完整版中打开此卡片 →
客户端估算的服务器时间不准时,插值时间点和冷却判定都会错位。
起因 连接时只对一次服务器时间,ping 变化后也不再调整 → 结果 插值时间点、冷却结束时刻与服务器错位 → 画面表现 对方偶尔顿一下,冷却已结束技能却被拒绝
- 症状
- 一卡一卡, 吞操作/回档
- 因素
- 延迟
- 谁会遇到
- 只有我
- 何时出现
- 开得越久越严重, 偶尔随机
- 负责方
- 主责 研发团队·客户端开发
- 研发团队要做的事
- 定期做时间同步(测出往返时间后校正),逐步对齐,避免突然跳变;计算经过的时间要用单调时钟(monotonic clock),不用 PC 的系统时间。
- 监控图上
- 缓慢爬升 · 估算的服务器时间误差
- 查看位置
- 定期记录客户端估算的服务器时间与服务器在数据包中下发的服务器时间(tick 序号)之差
- 确认依据
- 误差随连接时长增加而变大,或在 PC 时钟被校准的瞬间一下子跳变,同期技能被拒、顿一下的反馈增多
- 排除依据
- 误差一直很小技能仍被拒绝,查服务器判定、延迟一侧
- 确认手段
- 需要游戏服务器/客户端的日志和指标
- 深入了解
- 用 PC 的日期时间(墙上时钟,wall clock)计算经过的时间时,一旦 Windows 按网络时间校准时钟,或用户修改时钟,游戏时间就会跳变。经过的时间必须用不会倒退的单调时钟(monotonic clock,如 Stopwatch)计量。
出处
- RFC 5905: Network Time Protocol Version 4: Protocol and Algorithms Specification IETF
用请求和响应的四个时间点计算往返延迟和时钟误差的方法 - Acquiring high-resolution time stamps Microsoft
QueryPerformanceCounter(Stopwatch 使用它)是不与外部时间同步、专门计量经过时间的时钟;只有需要 UTC 时间时才用系统时间 - Time synchronization (Netcode for Entities 6.5) Unity
用往返时间估算服务器时间,不做大幅跳变,只一点点调整时间推进速度来对齐
相关原因
同一层:L1 客户端游戏进程
其他层中同样导致“一卡一卡”的原因
查看含图示和实验的原卡片