한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

游戏卡顿白皮书 › L1 客户端游戏进程

客户端预测不一致 Prediction mismatch / reconciliation

原因 ID cg-predict · 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发

在含图示和实验的完整版中打开此卡片 →

自己的客户端先把移动显示出来,服务器却算出了不同的结果,自己的角色就会被拽回去。

起因 客户端在服务器确认之前先移动(预测) → 结果 服务器对碰撞、移动速度、buff 的计算不同,或者没收到指令 → 画面表现 确认到达时,自己的角色被往回拽

症状
拉回
因素
丢包, 延迟
谁会遇到
只有我
何时出现
移动中/切换地图时, 偶尔随机
负责方
主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
研发团队要做的事
客户端:使用与服务器相同的移动代码,输入重复发送,校正要平滑。服务器:使用与客户端相同的移动代码,重复到达的输入按输入序号过滤,只处理一次。
数值参考
被拽回的距离是“偏差时长 × 移动速度”。只丢几条指令就有 1~3 m。
监控图上
偶发随机尖峰 · 服务器校正(预测失败)次数
查看位置
记录服务器下发的位置校正次数和校正距离。Unreal 统计服务器的 ClientAdjustPosition 校正,Unity Netcode for Entities 统计因预测失败而回滚重算的次数
确认依据
校正集中在拉回反馈的时刻,并且在特定 buff、地形、位移技能上校正距离反复偏大
排除依据
校正只在丢包严重时集中出现,是输入数据包丢失(线路)问题。没有校正、只有其他角色看起来被拽回,看“过度外推(航位推测)”
确认手段
需要游戏服务器/客户端的日志和指标

出处

  1. Introduction to prediction (Netcode for Entities 6.5) Unity
    客户端与服务器用相同的模拟代码做预测,与服务器状态不同(预测失败)时回滚重算,校正就会显现出来
  2. Use the command stream to handle user inputs (Netcode for Entities 6.5) Unity
    为应对丢包,把前几个 tick 的输入和最新输入一起重复发送
  3. Understanding Networked Movement in the Character Movement Component for Unreal Engine Epic Games
    客户端先移动,服务器重现同样的移动;位置不同时用 ClientAdjustPosition 校正,再重新应用保存下来的移动

相关原因

同一层:L1 客户端游戏进程

其他层中同样导致“拉回”的原因

查看含图示和实验的原卡片