游戏卡顿白皮书 › 同步设计
预表现后被服务器拒绝 Client-side feedback rejected by server
原因 ID sy-optimistic-reject · 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
在含图示和实验的完整版中打开此卡片 →
在自己画面上先显示出来的命中、技能,服务器事后不认可时,明明看到的结果就当没发生过。
起因 命中特效、技能动作在服务器确认前先播放(预表现) → 结果 服务器重新核对射程、目标位置、冷却、资源后拒绝 → 画面表现 血溅出来了却没有伤害,技能动作放出去了却没效果,只有冷却在转
- 症状
- 吞操作/回档, 拉回
- 因素
- 延迟
- 谁会遇到
- 只有我, 仅特定功能
- 何时出现
- 做特定操作时
- 负责方
- 主责 研发团队·客户端开发 · 配合 研发团队·服务器开发
- 研发团队要做的事
- 客户端:只有伤害数字、死亡、奖励这类需要确定的部分按服务器结果显示;常见的拒绝原因先在本地检查;被拒绝时退回冷却和资源,并显示原因。服务器:射程、目标位置检查按 ping 留出余量;拒绝响应中附上原因;按技能收集拒绝率指标。
- 数值参考
- 拒绝响应要在按下后再过 ping + tick 等待的时间才会到。ping 150 ms 时,约 0.2 秒里玩家都以为“打中了”。
- 监控图上
- 仅部分偏高 · 各技能的服务器拒绝率(按 ping 区间)
- 查看位置
- 在服务器上收集各技能的拒绝率和拒绝原因(射程、目标位置、冷却、资源),按玩家 RTT 区间拆分。在客户端记录预表现过的动作被拒绝的次数
- 确认依据
- 拒绝集中在特定技能以及射程、目标位置类原因上,ping 越高拒绝率越高
- 排除依据
- 拒绝原因是冷却、资源且与 ping 无关,看客户端和服务器的数据值(冷却、消耗)是否不同。没有拒绝、表现却在服务器响应之后才开始,是“收到服务器响应才播放表现(请求-响应方式)”
- 确认手段
- 需要游戏服务器/客户端的日志和指标
- 深入了解
- 预表现是掩盖 ping 的最好方法。不过客户端和服务器用来判断的信息(对手位置、剩余资源)差别越大,被拒绝就越频繁。按技能收集拒绝率指标,就容易找到判定对不上的地方。
出处
- Using Gameplay Abilities in Unreal Engine Epic Games
Local Predicted 技能在客户端立即执行,但由服务器做最终决定,并可能推翻结果 - Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve
在客户端预测武器开火、先播放效果,再用服务器结果修正预测误差
相关原因
同一层:同步设计
其他层中同样导致“吞操作/回档”的原因
查看含图示和实验的原卡片