Javascript 调用更新方法与使用setInterval

Javascript 调用更新方法与使用setInterval,javascript,design-patterns,Javascript,Design Patterns,在我的游戏引擎中,有一些对象需要定期更新。例如,一个场景可能会降低其alpha,因此我设置了一个间隔来实现这一点。此外,相机有时需要稍微抖动,这需要对旋转属性进行插值 我认为有两种方法可以解决这些问题: 具有一个update()方法,该方法调用所有其他对象的update方法。对象跟踪自上次更新以来的时间,并相应地执行操作 对每个对象的更新方法执行setInterval 最好的解决方案是什么?为什么?setInterval不遵循时钟,它只是在事件发生时对事件进行排序。浏览器倾向于在事件之间至少保留

在我的游戏引擎中,有一些对象需要定期更新。例如,一个场景可能会降低其alpha,因此我设置了一个间隔来实现这一点。此外,相机有时需要稍微抖动,这需要对旋转属性进行插值

我认为有两种方法可以解决这些问题:

  • 具有一个update()方法,该方法调用所有其他对象的update方法。对象跟踪自上次更新以来的时间,并相应地执行操作

  • 对每个对象的更新方法执行
    setInterval


  • 最好的解决方案是什么?为什么?

    setInterval
    不遵循时钟,它只是在事件发生时对事件进行排序。浏览器倾向于在事件之间至少保留一些小的时间。因此,如果你有10个事件都需要在100毫秒后触发,那么你可能会看到最后一个事件在200毫秒后触发。(这很容易测试)

    从这个意义上讲,只有一个事件(并对所有对象调用update)比每个对象设置自己的间隔要好。尽管可能还有其他考虑,但至少出于这个原因,选择2是不可行的


    下面是关于
    setInterval

    的更多信息。我发现,制作一个好的update()函数并保持一个好的帧率和更少的负载的最佳方法如下

    有一个单独的
    update()
    方法,通过循环所有可绘制对象的某种队列/时间表来绘制框架,他自己的
    update()
    函数被添加到此更新事件队列/时间表中。(eventlistener)


    这样,您就不必循环所有未计划重画/更新的对象(如菜单按钮或十字光标)。而且,对于所有可绘制对象,没有过多的间隔运行。

    我建议在
    setInterval
    上使用
    update()
    方法

    另外,我猜运行的几个设置间隔的计时是不可靠的


    另一种可能性,取决于游戏中发生的其他事情,使用一组单独的时间间隔可能会在计分和比较中引入竞争条件,等等

    建议的算法并非仅适用于相关方法。也就是说,可以使用setInteval调用所有更新方法,也可以通过反复调用setTimeout来更新每个对象本身

    更重要的是,单个计时器比多个计时器(任何一种类型)的开销都要小。当你有很多计时器时,这真的很重要。另一方面,只有一个计时器可能不适合,因为某些对象可能需要更新得比其他对象更频繁,或者更新到不同的时间表,所以请尽量将它们最小化

    setTimeout的一个优点是,可以调整到下一次调用的间隔,以满足特定的调度要求,例如,如果一次调用延迟,您可以跳过下一次调用或提前调用。setInterval将相对一致的时钟缓慢漂移,一次调整更加困难


    另一方面,setInteval只需要调用一次,这样就不必一直调用计时器。你可能会得到一个组合。

    我没有资格回答,但我看到的大多数例子似乎都倾向于选项1。这样,所有对象都会根据相同的游戏时间值进行更新。似乎如果每个对象都有自己的时间间隔,那么如果这有意义的话,事情可能会变得“不同步”。这两种方式之间到底有什么区别?在任何情况下,发动机都必须跟踪时间。+1@sellmeadog。当然要选择选项1。@Bergi理论上没有区别,除了
    setInterval
    不能像您预期的那样工作。请参阅我的答案。在旁边的注释中,考虑使用<代码>请求动画框架>代码>而不是<代码> SETIFATION>代码>,后退当然不可猜测,设置间隔/超时的时间是不可靠的。