Actionscript 3 在AS3/Flex游戏中TimerEvent与ENTER_FRAME?
我正在尝试用AS3/Flex4编写一个简单的游戏,并且我正在尝试从get-go中找到处理代码定时执行的最佳方法 最自然的方法是在整个程序中使用一组Actionscript 3 在AS3/Flex游戏中TimerEvent与ENTER_FRAME?,actionscript-3,apache-flex,events,timer,flex4,Actionscript 3,Apache Flex,Events,Timer,Flex4,我正在尝试用AS3/Flex4编写一个简单的游戏,并且我正在尝试从get-go中找到处理代码定时执行的最佳方法 最自然的方法是在整个程序中使用一组计时器对象。然而,与ENTER\u FRAME相比,这在CPU周期上相当昂贵 然而,我不确定一个程序的所有定时执行都基于ENTER_FRAME,这会有多自然,我在stackoverflow上读到,当程序的复杂性增加时,它会遇到一些问题,Timer不会 我想到的另一个选项是,只需在程序中使用一个Timer对象,它的事件处理程序将在一次遍历中遍历并检查所有
计时器对象。然而,与ENTER\u FRAME
相比,这在CPU周期上相当昂贵
然而,我不确定一个程序的所有定时执行都基于ENTER_FRAME
,这会有多自然,我在stackoverflow上读到,当程序的复杂性增加时,它会遇到一些问题,Timer
不会
我想到的另一个选项是,只需在程序中使用一个Timer
对象,它的事件处理程序将在一次遍历中遍历并检查所有内容-有点像混合了通常的Timer
和ENTER\u FRAME
方法
我的问题是:对于AS3/Flex4中的视频游戏,什么才是最好的主意,为什么?谢谢 这完全取决于您希望何时更新值、检查冲突、管理输入等等,而不是您希望何时在屏幕上实际看到发生的事情
ENTER_FRAME
将使更新逻辑与游戏渲染同步
每次调度ENTER\u FRAME
事件时,都会重新绘制场景。这意味着所有的游戏更新逻辑总是紧跟着被渲染的屏幕。如果游戏中的帧速率由于屏幕上复杂的图形需要很长时间渲染而下降,那么游戏更新的速率也会下降ENTER_FRAME
dispatch不稳定,这意味着它们不适用于需要以偶数间隔执行的更新任务
- 计时器将导致更新逻辑和游戏渲染变得异步
计时器的触发频率可能比
ENTER\u帧
处理程序的触发频率高得多或低得多。这意味着您的更新循环可以在场景重绘之前运行多次,或者场景可以在不做任何更改的情况下重绘多次。计时器不像ENTER\u FRAME
处理程序那样不稳定,使它们能够更好地在设定的时间间隔内完成任务。尽管如此,更新之间仍会有一点偏移:
根据SWF文件的帧率或运行时环境(可用内存和其他因素),运行时可能会以稍微偏移的间隔调度事件。例如,如果将SWF文件设置为以每秒10帧(fps)的速度播放,即以100毫秒的间隔播放,但将计时器设置为以80毫秒的间隔触发事件,则事件将在接近100毫秒的间隔时调度。内存密集型脚本也可能会抵消事件。
就我个人而言,我一直使用ENTER\u FRAME
vs定时器。对我来说,如果我对游戏中的对象进行更改,这些更改应该立即显示在屏幕上,这是合乎逻辑的
如果您希望能够以比帧速率更快的速度更新游戏中的组件,计时器是很好的。如果您希望在特定时间范围内完成给定数量的更新,计时器也很好,因为它们不受屏幕重画速率的限制,就像ENTER\u FRAME
is一样
至于实际实现,您最好选择一个并实现一个处理程序。这意味着在整个游戏中,您应该只有一个功能,该功能将由计时器或ENTER\u FRAME
触发。您不希望在每个应更新的类中创建单独的处理程序。相反,您希望让顶级类(或该类的近亲)定义处理程序。您还需要在该类中创建一个列表,该列表将表示游戏中需要更新的所有内容
从那里,您将创建一个方法的小集合,用于处理该类中可更新实例的列表和取消列表。每个可更新实例要么实现一个接口,要么扩展一个定义update()
方法的类。它可能是这样的:
public interface IUpdatable
{
function update();
}
for each(var i:IUpdatable in updateList)
{
i.update();
}
从这里开始,updater类中的更新处理程序将简单地迭代列表中的所有可更新项,并调用它们的update()
方法,如下所示:
public interface IUpdatable
{
function update();
}
for each(var i:IUpdatable in updateList)
{
i.update();
}
最后一点需要注意的是,这种方法意味着,如果您决定从使用ENTER\u FRAME
处理程序切换到计时器,或者反之亦然,那么它只是updater类中的一个简单切换,不需要您更改游戏代码的任何其他部分。如果你在每个需要更新的类中创建处理程序,你的改变将意味着对每个类进行更改。在我看来,最好的方法是使用一个主计时器或进入\u帧。然后在计时器内,只需调用游戏中需要时间的每个对象的更新函数。定时器可能是你最好的选择。这里有一篇关于定时器使用的不错的文章---我个人使用过这两种方法,但不能说这两种方法都有重大影响。我倾向于使用ENTER_帧,计算帧间的时间以进行运动计算,并更新所有对象。我想说得更详细一些,但是互联网上确实有很多关于这场辩论的信息,就在谷歌上。我很难从阅读中判断使用回车框或单个计时器是否真的有什么特别的优势。听起来使用几个计时器的想法是个坏主意。是的,我真的会专注于更大的问题,比如制作游戏。从一个切换到另一个确实是非常琐碎的,正如我所说的,我不能说我经历了一个重要的因素,使一个或另一个成为一个明确的选择。