在我的游戏引擎中,有些对象需要定期更新。例如,场景可以降低其alpha值,因此我设置了一个间隔来执行它。此外,相机有时需要稍微摇晃,这需要对旋转属性进行插值。
我看到有两种方法可以解决这些问题:
使用update()方法调用所有其他对象的更新方法。对象跟踪自上次更新以来的时间并采取相应措施。
为每个对象的更新方法执行setInterval
。
什么是最佳解决方案,为什么?
答案 0 :(得分:4)
setInterval
不会保留时钟,它只会在事件进入时对事件进行排序。浏览器往往会在事件之间保留至少一些时间。因此,如果您有10个事件需要在100毫秒后触发,您可能会看到最后一个事件在200毫秒内完成。 (这很容易测试)。
只有一个事件(并且在所有对象上调用更新)在这个意义上更好比让每个对象设置它自己的间隔。可能还有其他考虑因素,但至少由于这个原因,选项2是不可行的。
以下是有关setInterval
How do browsers determine what time setInterval should use?
答案 1 :(得分:1)
我发现制作良好的update()函数并保持良好的帧速率和较少的负载的最佳方法如下。
使用单个update()
方法绘制您的框架,方法是将所有可绘制对象的某种队列/计划循环到自己的update()
函数中,这些函数将添加到此更新事件队列/计划中。 (事件侦听)
这样您就不必循环所有未安排重绘/更新的对象(如菜单按钮或十字准线)。并且您没有为所有可绘制对象运行过多的间隔。
答案 2 :(得分:0)
我建议在update()
上使用setInterval
方法。
另外,我猜想运行几个setintervals的时间不可靠。
另一种可能性,取决于你的游戏中发生的其他事情,使用一堆单独的间隔可能会在计数和比较得分等方面引入竞争条件
答案 3 :(得分:0)
所提出的算法并不是相关方法所独有的。也就是说,您可以使用setInteval来调用所有更新方法,也可以通过重复调用setTimeout让每个对象自行更新。
更重要的是,单个计时器的开销低于多个计时器(任何一种类型)。当你有很多计时器时,这真的很重要。另一方面,只有一个计时器可能不适合,因为某些对象可能需要比其他对象更频繁地更新,或者不同的计划,所以只需尽量减少它们。
setTimeout的一个优点是可以调整到下一个呼叫的间隔以满足特定的调度要求,例如:如果有人延迟你可以跳过下一个或更快。 setInterval将相对于一致的时钟缓慢漂移,而且其中一项调整更加困难。
另一方面,setInteval只需要调用一次,因此您不必继续调用计时器。你最终可能会得到一个组合。