游戏卡顿白皮书 › L1 客户端游戏进程
客户端预测不一致 Prediction mismatch / reconciliation
原因 ID cg-predict · 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
自己的客户端先把移动显示出来,服务器却算出了不同的结果,自己的角色就会被拽回去。
起因 客户端在服务器确认之前先移动(预测) → 结果 服务器对碰撞、移动速度、buff 的计算不同,或者没收到指令 → 画面表现 确认到达时,自己的角色被往回拽
- 症状
- 拉回
- 因素
- 丢包, 延迟
- 谁会遇到
- 只有我
- 何时出现
- 移动中/切换地图时, 偶尔随机
- 负责方
- 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
- 研发团队要做的事
- 客户端:使用与服务器相同的移动代码,输入重复发送,校正要平滑。服务器:使用与客户端相同的移动代码,重复到达的输入按输入序号过滤,只处理一次。
- 数值参考
- 被拽回的距离是“偏差时长 × 移动速度”。只丢几条指令就有 1~3 m。
- 监控图上
- 偶发随机尖峰 · 服务器校正(预测失败)次数
- 查看位置
- 记录服务器下发的位置校正次数和校正距离。Unreal 统计服务器的 ClientAdjustPosition 校正,Unity Netcode for Entities 统计因预测失败而回滚重算的次数
- 确认依据
- 校正集中在拉回反馈的时刻,并且在特定 buff、地形、位移技能上校正距离反复偏大
- 排除依据
- 校正只在丢包严重时集中出现,是输入数据包丢失(线路)问题。没有校正、只有其他角色看起来被拽回,看“过度外推(航位推测)”
- 确认手段
- 需要游戏服务器/客户端的日志和指标
出处
- Introduction to prediction (Netcode for Entities 6.5) Unity
客户端与服务器用相同的模拟代码做预测,与服务器状态不同(预测失败)时回滚重算,校正就会显现出来 - Use the command stream to handle user inputs (Netcode for Entities 6.5) Unity
为应对丢包,把前几个 tick 的输入和最新输入一起重复发送 - Understanding Networked Movement in the Character Movement Component for Unreal Engine Epic Games
客户端先移动,服务器重现同样的移动;位置不同时用 ClientAdjustPosition 校正,再重新应用保存下来的移动
相关原因
同一层:L1 客户端游戏进程
其他层中同样导致“拉回”的原因
查看含图示和实验的原卡片