【问题标题】:How does Flash Player execute Timer?Flash Player 如何执行 Timer?
【发布时间】:2013-07-26 09:12:43
【问题描述】:

我了解 Flash Player 和 Air Debugger 中的运行时代码执行基础。但我想知道 Timer 代码执行是如何完成的。 使用 Timer 而不是 enterFrame 事件进行类似操作会更好吗?哪一个更适合最大化优化?

【问题讨论】:

    标签: optimization air flash


    【解决方案1】:

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

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

    最后,将 Timer 用于调用少于 ENTER_FRAME 的任何内容都没有多大意义。除此之外,您还有丢帧的风险。 ENTER_FRAME 几乎适用于所有与图形相关的东西,除了让某些东西在精确的时间出现/更新。即便如此,您也应该使用 ENTER_FRAME,因为它只会在下一帧中呈现。

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

    编辑

    我拼凑了一个快速测试应用来查看 Timer 何时触发。帧率为 24fps (42ms),我将计时器设置为每 10ms 运行一次。这是它运行的时间选择。

    2121
    2137
    2154
    2171
    2188
    2203
    2221
    2237
    

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

    【讨论】:

    • 谢谢@JoshJanusch ,Timer 代码执行是如何完成的?在每个帧循环中还是仅在需要执行时?
    • 看来Timer 将在ENTER_FRAME 事件附近触发,但不依赖它。因此,您不能比ENTER_FRAME 更频繁地先启动它,但它可以更快地启动。您可以通过设置计时器并通过追踪getTimer() 来查看它与delay 触发的接近程度来自己测试这一点
    • @yaa110 请查看我刚刚对我的回答所做的编辑
    • 我认为 Timer 的文档说你不应该将 Timer 用于短于 16ms(大约 60fps)的间隔,因为它不可靠。
    • @jpop 我的快速测试似乎表明了这一点,但还有更多。似乎 Timer 尽可能接近 ENTER_FRAME 执行。在 24fps (41.7ms) 上,将其设置为 43 的倍数会看到 30-40ms 的差异。将其设置为 40ms 每次都会在 1-2ms 内看到它。从这些结果来看,Timer 似乎根本不准确(正如我最初认为的那样)
    猜你喜欢
    • 2022-08-04
    • 1970-01-01
    • 1970-01-01
    • 2011-03-02
    • 2011-05-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多