客户端与服务器帧率不同造成技能异常

最近项目中遇到一个问题, 玩家平A怪物, 没隔一段时间,都会失败一次。

看服务器日志, 是没隔一段时间,会出现一次技能出队异常的log (机制为:收到客户端消息, 如果当前不可释放, 如CD、技能延迟等,会暂存队列)

一开始奇怪的是,有的客户端能重现,有的客户端不能重现。折腾了很久,才发现是客户端帧率的不同。

60帧客户端会出问题,30帧客户端不会出问题。服务器帧数约1s/80ms。

统计客户端发消息不同,60帧,约330ms发一次,30帧,约300ms发一次, 按公式算服务器实际允许的攻速应是290ms/次。

服务器加攻击延时,是在当前时间戳上,加上攻击用时。 分析了很久发现问题出在这里。

如下图,80ms一帧,* 为处理技能的实际允许释放时间点

|-----|-----|-----|---*-|-----|

0       80     160     240    300

在290ms时,可以释放了,当时服务器在300ms的时候才处理到,然后采用的延时又是  current_time + delay, 导致每次入队出队,多加了current_time - skill_time的时间。

当多加的时间积累,增加到队列元素最大等待时间时, 即丢失了一次技能。 导致技能释放失败。

修改方式: 将原本current_time + delay 改为,判断 current_time - skill_time < 一帧时长(80ms), 则延时时间戳为, skill_time + delay,其他情况依然是 current_time + delay.

posted @ 2020-07-27 00:50  upupon  阅读(513)  评论(0编辑  收藏  举报