Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Actionscript 3 在AS3/Flex游戏中TimerEvent与ENTER_FRAME?_Actionscript 3_Apache Flex_Events_Timer_Flex4 - Fatal编程技术网

Actionscript 3 在AS3/Flex游戏中TimerEvent与ENTER_FRAME?

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对象,它的事件处理程序将在一次遍历中遍历并检查所有

我正在尝试用AS3/Flex4编写一个简单的游戏,并且我正在尝试从get-go中找到处理代码定时执行的最佳方法

最自然的方法是在整个程序中使用一组
计时器
对象。然而,与
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_帧,计算帧间的时间以进行运动计算,并更新所有对象。我想说得更详细一些,但是互联网上确实有很多关于这场辩论的信息,就在谷歌上。我很难从阅读中判断使用回车框或单个计时器是否真的有什么特别的优势。听起来使用几个计时器的想法是个坏主意。是的,我真的会专注于更大的问题,比如制作游戏。从一个切换到另一个确实是非常琐碎的,正如我所说的,我不能说我经历了一个重要的因素,使一个或另一个成为一个明确的选择。