游戏卡顿白皮书 › 只有部分人遇到的问题
网络差的玩家在别人画面上快进移动 Laggy player seen by others (bursty inputs)
原因 ID pt-slow-burst · 主责 研发团队·服务器开发 · 配合 外部·外部
在含图示和实验的完整版中打开此卡片 →
线路差的人,输入会忽多忽少地扎堆到达服务器。服务器每个 tick 收到多少就应用多少时,在别人眼里,这个角色会顿一下,然后一下子走出好几步。
起因 网络差的人的移动指令,有的 tick 到 0 条,有的 tick 一次到 2~3 条 → 结果 服务器在收到的那个 tick 一次性全部应用,该角色的位置呈台阶式变化 → 画面表现 在别人画面上只有这个角色顿一下,然后一下子快进移动。其他都正常
- 症状
- 快进, 瞬移
- 因素
- 抖动, 丢包
- 谁会遇到
- 只有某个角色看起来异常, 特定地区/运营商
- 何时出现
- 一直, 移动中/切换地图时
- 负责方
- 主责 研发团队·服务器开发 · 配合 外部·外部
- 研发团队要做的事
- 用每个玩家的输入缓冲把指令均匀分摊应用,按输入序列号以原本的间隔应用;只加长别人画面上的插值缓冲是不够的(因为服务器上的位置记录本身就是台阶状)。
- 外部要做的事
- 引导网络差的玩家改用有线连接,检查 Wi-Fi 和路由器。
- 数值参考
- 抖动 80 ms 时,在 20 tick(50 ms)服务器上,每个 tick 的指令数会在 0~3 条之间波动。
- 监控图上
- 仅部分偏高 · 各玩家每 tick 应用的指令数,各玩家的抖动
- 查看位置
- 在服务器侧抓包,只过滤被反馈玩家发出的包,按 tick 间隔(例如 50 ms)统计每次到达几个,与其他玩家对比。有服务器日志时,按玩家看每个 tick 应用的移动指令数和输入序列号
- 确认依据
- 只有被反馈玩家的包在每个 tick 0 个与 2~3 个之间来回、扎堆到达,该玩家的抖动、丢包高,其他玩家的包到达均匀。该玩家换成有线后情况减轻
- 排除依据
- 多个角色同时快进移动,是服务器 tick 延迟或观看者一侧的线路问题。到达和应用都均匀,却只有这个角色看起来在跳,是观看者一侧的插值、显示问题
- 确认手段
- 运维工具即可确认(无需游戏代码)
- 深入了解
- 在服务器权威结构中,这是正常行为。一个网络差的人的卡顿,在别人眼里只表现为“这个人动作怪异”,不会影响其他人的操作或怪物的移动。不过与这个人直接交互的事情(交易、队伍机制、PvP 判定)会一起变慢。
出处
- Peeking into VALORANT's Netcode Riot Games
服务器把到达的输入按 tick 顺序放进每个玩家的移动队列,队列空了就用预测填补。校正只有该玩家自己看得到,其他人看到的是流畅的 - State Synchronization Gaffer On Games
每秒发 60 次的包,也会像一帧到 2 个、下一帧到 0 个这样扎堆到达 - Source SDK 2013: player.cpp Valve
把扎堆到达的指令分摊到各个服务器 tick 处理(meter out)
相关原因
同一层:只有部分人遇到的问题
其他层中同样导致“快进”的原因
查看含图示和实验的原卡片