Optimization Flash Player如何执行计时器?

Optimization Flash Player如何执行计时器?,optimization,air,flash,Optimization,Air,Flash,我了解Flash Player和Air调试器中的运行时代码执行基础知识。但我想知道定时器代码是如何执行的。 对于类似的操作,使用计时器比使用enterFrame事件更好吗?哪一个更适合最大化优化?这取决于您想使用它做什么。大多数人会激烈地说使用事件。输入\u FRAME。在大多数情况下,这就是你想要的。只有在每个框架开始构建时才会调用它。如果您的应用程序以24fps(默认值)运行,则假设没有丢弃帧,该代码将每41.7ms运行一次。对于几乎所有与GUI相关的情况,您都不希望比这更频繁地运行该代码,

我了解Flash Player和Air调试器中的运行时代码执行基础知识。但我想知道定时器代码是如何执行的。
对于类似的操作,使用计时器比使用enterFrame事件更好吗?哪一个更适合最大化优化?

这取决于您想使用它做什么。大多数人会激烈地说使用
事件。输入\u FRAME
。在大多数情况下,这就是你想要的。只有在每个框架开始构建时才会调用它。如果您的应用程序以24fps(默认值)运行,则假设没有丢弃帧,该代码将每41.7ms运行一次。对于几乎所有与GUI相关的情况,您都不希望比这更频繁地运行该代码,因为这是完全不必要的(当然,您可以更频繁地运行它,但它不会有任何好处,因为屏幕只会经常更新)

但是,有时您需要更频繁地运行代码,主要是在与GUI无关的情况下。这可以从需要在后台进行的系统检查到需要绝对精确的检查,例如需要以精确间隔显示/更新的对象(我相信计时器精确到毫秒,而ENTER_FRAME仅精确到1000/帧速率毫秒)

最后,如果调用的帧小于ENTER\u,那么使用计时器就没有多大意义。再多的话,你就有掉镜框的危险。ENTER_FRAME适用于几乎所有与图形相关的内容,而不是在精确的时间显示/更新某些内容。即使这样,您也应该使用ENTER_FRAME,因为它只会在下一帧中渲染

您需要逐个评估每种情况,并确定哪种情况最适合该特定情况,因为没有针对所有情况的最佳答案

编辑

我组装了一个快速测试应用程序来查看计时器何时启动。帧速率为24fps(42ms),我将计时器设置为每10ms运行一次。下面是它运行的时间选择

2121
2137
2154
2171
2188
2203
2221
2237

如您所见,它每15-18毫秒运行一次,而不是我希望的10毫秒。我还测试了20ms、100ms、200ms和1000ms。最后,每一颗都在应该发射的10毫秒内发射。所以这并不像我最初想象的那么精确。

谢谢@JoshJanusch,那么计时器代码是如何执行的呢?在每个帧循环中或需要执行时?似乎
计时器将在
ENTER\u frame
事件附近触发,但不依赖它。因此,您不能比“输入帧”
更频繁地首先触发它,但可以更快地触发它。你可以自己设置一个计时器,通过追踪
getTimer()
@yaa110查看我刚才对我的回答所做的编辑,看看它与
延迟的距离有多近,我想计时器的文档说,你不应该在短于16ms(大约60fps)的时间间隔内使用计时器因为它不可靠。@jpop我的快速测试似乎表明了这一点,但还有更多。计时器似乎在尽可能接近进入_帧时执行。在24fps(41.7ms)时,将其设置为43的倍数会看到30-40ms的差异。将其设置为40ms,每次可在1-2ms内看到它。从这些结果来看,计时器似乎一点也不准确(正如我最初认为的那样)