actionscript-3 - TimerEvent 与 AS3/Flex 游戏中的 ENTER_FRAME?

标签 actionscript-3 apache-flex events timer flex4

我正在尝试在 AS3/Flex 4 中编写一个简单的游戏,并且我正在尝试从一开始就找到处理代码定时执行的最佳方法。

最自然的方法是在整个程序中使用一堆 Timer 对象。然而,与 ENTER_FRAME 相比,这在 CPU 周期上应该是相当昂贵的。

但是我不确定将所有程序的定时执行都基于 ENTER_FRAME 是多么自然,而且我在 stackoverflow 上读到它有问题 - Timer 不会 - 关于当程序复杂性增加时降低动画和帧率。

想到的另一种选择是在程序中简单地使用一个 Timer 对象,它的事件处理程序将遍历并一次检查所有内容 - 有点像混合通常的 计时器ENTER_FRAME 方法。

我的问题是:对于 AS3/Flex 4 中的视频游戏来说,真正最好的创意是什么,为什么?谢谢!

最佳答案

这完全取决于何时您想要更新值、检查碰撞、管理输入等以及您何时想要在屏幕上实际看到发生的事情

  • ENTER_FRAME 将使您的更新逻辑和游戏呈现同步

    每次分派(dispatch) ENTER_FRAME 事件时,都会重新绘制场景。这意味着您的所有游戏更新逻辑总是紧跟正在呈现的屏幕。如果由于屏幕上的复杂图形需要很长时间才能渲染而导致游戏中的帧速率下降,那么游戏更新的速率也会下降。 ENTER_FRAME 调度不稳定,这意味着它们不适合您需要以均匀间隔执行的更新任务。

  • 计时器将使您的更新逻辑和游戏呈现变得异步

    ENTER_FRAME 处理程序相比,计时器的触发频率可能更高或更低。这意味着您的更新循环可以在重绘场景之前运行多次,或者场景可以重绘多次而没有任何变化。计时器比 ENTER_FRAME 处理程序更稳定,使它们更擅长按设定的时间间隔做某事。尽管如此,更新之间仍然会有一点偏移:

    Depending on the SWF file's framerate or the runtime environment (available memory and other factors), the runtime may dispatch events at slightly offset intervals. For example, if a SWF file is set to play at 10 frames per second (fps), which is 100 millisecond intervals, but your timer is set to fire an event at 80 milliseconds, the event will be dispatched close to the 100 millisecond interval. Memory-intensive scripts may also offset the events.
    - help.adobe.com | flash.utils.Timer

我个人一直使用 ENTER_FRAME 与定时器。对我来说,如果我对游戏中的对象进行更改,这些更改应该立即显示在屏幕上,这是合乎逻辑的。

如果您希望能够比帧速率能够管理的更快地更新游戏中的组件,那么定时器是个不错的选择。如果您希望在特定时间范围内完成给定数量的更新,计时器也很好,因为它们不像 ENTER_FRAME 那样受屏幕重绘速率的限制。


至于实际实现,您最好选择一个实现一个处理程序。这意味着您在整个游戏中应该只有一个函数,该函数将由 Timer 或 ENTER_FRAME 触发。您不希望在每个应该更新的类中创建单独的处理程序。相反,您希望让您的顶级类(或该类的近亲)定义处理程序。您还想在该类中创建一个列表,该列表将代表游戏中需要更新的所有内容。

从那里,您将创建一小部分方法,这些方法将处理从该类中列出和取消列出可更新实例。每个可更新实例将实现一个接口(interface)或扩展一个定义 update() 方法的类。它可能看起来像这样:

public interface IUpdatable
{
    function update();
}

从那里开始,更新程序类中的更新处理程序将简单地遍历列表中的所有可更新项并调用它们的 update() 方法,如下所示:

for each(var i:IUpdatable in updateList)
{
    i.update();
}

最后要注意的是,这种方法意味着如果您决定从使用 ENTER_FRAME 处理程序切换到 Timer,反之亦然,这只是更新程序类中的一个简单切换,不需要您可以更改游戏代码的任何其他部分。如果您在每个需要更新的类中四处创建处理程序,那么您改变主意将意味着对每个类进行更改。

关于actionscript-3 - TimerEvent 与 AS3/Flex 游戏中的 ENTER_FRAME?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16291570/

相关文章:

javascript - onmouseover子div问题

flash - 如何在as3中找到IP地址?

android - Flex Mobile 监听 <s :View> 中的事件

css - 在 Flex3 Air 中创建和编辑 CSS

java - 如何在flex中创建动态数据网格

javascript - removeEventListener 不引用事件处理程序

闪光灯, ActionScript 3 : how do you give a the EventListener a function With parameters?

javascript - 对 Flex 的 Iframe Javascript 调用

flash - 我如何知道 MovieClip 何时放置在舞台上完成播放?

javascript - 事件监听器不返回所有事件类型的对象属性