估计很多初学Cocos2D-JS者在使用定时器schedule的时候没有发现它有误差,可是在游戏开发的时候没有发现这个小问题,在游戏运行的时候很可能会有无法想象的后果,接下来本教程将教大家用Cocos2D-JS制作不变慢的定时器。
对于动画控制,可能一点误差,大家不会察觉,但如果多次循环累积或网络同步等,大家就会很清楚意识到schedule的误差问题。
首先做一个例子证明一下:
帧频越低,变慢得越快。
那么尝试一下解决问题?
定时器原理:cocos2d-js底层在每一帧计算中,遍历所有定时器,看是否达到触发时间。如果达到则触发该定时器,并把时间重置为当前时间。好了,问题就在于此,“重置为当前时间”。
看看一个新的定时器:
这里核心是then=now-(delta%interval),每一次触发的时候,把误差算到下次触发的控制中。
例如60fPS,那么schedule2每16ms触发一次,用户设定了100ms的interval,那么将有16*7=112>100,7帧才触发1次用户的定时器。这里累积了12ms误差,把12ms算到then中。
那么下次将有12+16*6=108>100,只需要96ms就触发第2次用户的定时器,这次提前了4ms,弥补了第1次的误差。
这个定时器经得起考验,即使在低帧频情况下,仍然保持稳定。
输出:
¥98.00
¥108.00
¥98.00
¥698.00