1. 移动机制类bug
典型:
- 单骑救主副本,第一关赵云,跳桥跳不起来。
- 十里坡队友加速拉回。
- YY释放80/xs释放技能拉回
- 明明敌人在群攻范围内就是没命中
复现的方法有,YY在释放80的期间按住【左】/【右】移动键,在释放技能完成后一段距离会被拉回。
这类bug都是属于移动机制bug,出现的原因是:
服务器的帧和客户端帧不一致。且游戏以服务端运算下发为主。
首先,了解一下帧的概率:
一定看过那种翻页就能动的小人书吧,比如下面这个动画:
一秒能翻多少张,就代表帧数有多少。如果一秒翻60页,那说明就是60帧,帧数越高,画面越流畅。
三国为了防止快攻,加速齿轮等外挂。选择运算以服务器帧为准,以渲染和输入输出以客户端为准。
如果服务器的帧比客户端慢会发生什么?
假设一个极端的场景,客户端是稳定的50帧,那么每帧的时间就是20毫秒,假设一个技能的动作需要1010毫秒。
那么客户端就需要1010/20=50.5帧。在客户端渲染到50帧的时候,如果玩家输入释放另外一个技能,会发现前面
的技能动作才完成了50帧*20毫秒=1000毫秒,也就是说技能动作尚未完成,那么客户端就忽略这次输入。
当客户端渲染到51帧的时候,此时技能动作已经完成了1020秒,大于技能动作1010秒,那么就可以将玩家的释放技能指令发送给服务器。
客户端帧数越高,意味着响应玩家输入的速度也越快。在50帧的情况下释放一个1010毫秒的技能,需要1020毫秒,会浪费10毫秒。
假设服务器的帧数是8帧,即1000/8=125毫秒刷新一帧,就会出现一个很有意思的情况,服务器需要1010/125=8.08帧,也就是最少需要9帧。也就是最少需要1125毫秒。也就是说,客户端提早了1125-1020 =105毫秒告诉服务器移动指令。
此时服务器是怎么处理的(拒绝掉此次移动指令)而客户端在发起移动时提前预测服务器是返回成功的,结果走到一半,发现服务器拒绝了。所以客户端选择回滚此次移动,人物被拉回了。
基于上述理论,继续分析十里坡和单骑赵云跳桥跳不起来的问题。
在移动时,服务器还应该需要校准玩家发起移动时的各个参数。(移动速度跳跃等)而玩家的速度跟状态相关,
而有些状态,则跟人物位置相关。
十里坡的加速是,当附近的军团成员距离小于x时,则给玩家附加XX状态。而在运动时的玩家,他的位置也是一帧更新一次。服务端由于使用了更低的帧,这导致了客户端觉得我应该拥有XX加速状态,那么移动的时候就告诉服务器我此时的速度应该是人物速度x+状态速度x = 2x。而服务器缺觉得某个玩家距离某个位置的距离还不够附加状态。所以服务器觉得人物速度应该是x。
总的来说,就是在2023年计算能力相较15年前已经提升了数千倍。而三国依然没有想着提升自己的服务器tick。隔壁的CF已经从8 tick 提升到30(尽管现在主流游戏早已经64 甚至128tick为主)
典型:
- 单骑救主副本,第一关赵云,跳桥跳不起来。
- 十里坡队友加速拉回。
- YY释放80/xs释放技能拉回
- 明明敌人在群攻范围内就是没命中
复现的方法有,YY在释放80的期间按住【左】/【右】移动键,在释放技能完成后一段距离会被拉回。
这类bug都是属于移动机制bug,出现的原因是:
服务器的帧和客户端帧不一致。且游戏以服务端运算下发为主。
首先,了解一下帧的概率:
一定看过那种翻页就能动的小人书吧,比如下面这个动画:
一秒能翻多少张,就代表帧数有多少。如果一秒翻60页,那说明就是60帧,帧数越高,画面越流畅。
三国为了防止快攻,加速齿轮等外挂。选择运算以服务器帧为准,以渲染和输入输出以客户端为准。
如果服务器的帧比客户端慢会发生什么?
假设一个极端的场景,客户端是稳定的50帧,那么每帧的时间就是20毫秒,假设一个技能的动作需要1010毫秒。
那么客户端就需要1010/20=50.5帧。在客户端渲染到50帧的时候,如果玩家输入释放另外一个技能,会发现前面
的技能动作才完成了50帧*20毫秒=1000毫秒,也就是说技能动作尚未完成,那么客户端就忽略这次输入。
当客户端渲染到51帧的时候,此时技能动作已经完成了1020秒,大于技能动作1010秒,那么就可以将玩家的释放技能指令发送给服务器。
客户端帧数越高,意味着响应玩家输入的速度也越快。在50帧的情况下释放一个1010毫秒的技能,需要1020毫秒,会浪费10毫秒。
假设服务器的帧数是8帧,即1000/8=125毫秒刷新一帧,就会出现一个很有意思的情况,服务器需要1010/125=8.08帧,也就是最少需要9帧。也就是最少需要1125毫秒。也就是说,客户端提早了1125-1020 =105毫秒告诉服务器移动指令。
此时服务器是怎么处理的(拒绝掉此次移动指令)而客户端在发起移动时提前预测服务器是返回成功的,结果走到一半,发现服务器拒绝了。所以客户端选择回滚此次移动,人物被拉回了。
基于上述理论,继续分析十里坡和单骑赵云跳桥跳不起来的问题。
在移动时,服务器还应该需要校准玩家发起移动时的各个参数。(移动速度跳跃等)而玩家的速度跟状态相关,
而有些状态,则跟人物位置相关。
十里坡的加速是,当附近的军团成员距离小于x时,则给玩家附加XX状态。而在运动时的玩家,他的位置也是一帧更新一次。服务端由于使用了更低的帧,这导致了客户端觉得我应该拥有XX加速状态,那么移动的时候就告诉服务器我此时的速度应该是人物速度x+状态速度x = 2x。而服务器缺觉得某个玩家距离某个位置的距离还不够附加状态。所以服务器觉得人物速度应该是x。
总的来说,就是在2023年计算能力相较15年前已经提升了数千倍。而三国依然没有想着提升自己的服务器tick。隔壁的CF已经从8 tick 提升到30(尽管现在主流游戏早已经64 甚至128tick为主)