客户端与服务器帧率不同造成技能异常
最近项目中遇到一个问题, 玩家平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.