Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/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
Actionscript 3 Actionscript 3.0:对于更新方法,使用ENTER_FRAME事件和计时器事件有什么区别?_Actionscript 3_Flash - Fatal编程技术网

Actionscript 3 Actionscript 3.0:对于更新方法,使用ENTER_FRAME事件和计时器事件有什么区别?

Actionscript 3 Actionscript 3.0:对于更新方法,使用ENTER_FRAME事件和计时器事件有什么区别?,actionscript-3,flash,Actionscript 3,Flash,我正在寻找一些比较ENTER_FRAME和TIMER方法的更新方法。我在互联网上寻找了一些答案,但我仍然觉得很难理解 有人能帮助简化他们之间的差异吗?输入帧与电影的帧速率有关。计时器事件应该是绝对的。计时器事件可以独立于swf的帧速率(到某一点)进行调度。与ENTER_FRAME事件相比,这些事件的发生频率可能更高或更低,如果您关心计算的精度,则应使用这些事件,因为它们发生在ENTER_FRAME覆盖的时间跨度之间。最常见的用例是物理引擎,您可能希望尽可能精确,因此希望以比Flash的fps更快

我正在寻找一些比较ENTER_FRAME和TIMER方法的更新方法。我在互联网上寻找了一些答案,但我仍然觉得很难理解


有人能帮助简化他们之间的差异吗?

输入帧与电影的帧速率有关。计时器事件应该是绝对的。

计时器事件可以独立于swf的帧速率(到某一点)进行调度。与ENTER_FRAME事件相比,这些事件的发生频率可能更高或更低,如果您关心计算的精度,则应使用这些事件,因为它们发生在ENTER_FRAME覆盖的时间跨度之间。最常见的用例是物理引擎,您可能希望尽可能精确,因此希望以比Flash的fps更快的速度执行模拟

此外,如果您希望特定操作在给定延迟后发生,计时器也很有用。例如,计时器允许您在10秒后轻松执行操作。您只需将10000毫秒传递给计时器的构造函数,然后计时器事件将在10秒后被调度。如果要使用ENTER_FRAME,您需要手动跟踪每次帧更新所经过的时间,如果您想知道10秒是什么时候过去的


ENTER_帧事件与时间线的渲染周期相关联,并且或多或少与指定的帧速率相匹配。例如,如果帧速率为30fps,则每秒将接收大约30个ENTER_帧事件。如果您有一个特别复杂的显示列表,或者如果您的逻辑执行时间特别长,您可能会收到更少的信息

ENTER_FRAME是每次虚拟机的渲染循环运行时都会触发的事件,它与电影的帧率有关。例如,在Flash CS IDE中,如果将帧速率设置为30,则从根显示对象或阶段,每秒将触发30个ENTER_帧事件

另一方面,计时器就是计时器。它仅根据系统时钟时间运行。例如,如果将计时器的延迟设置为1毫秒,则该计时器将在启动后触发1毫秒,如果启用该计时器,则该计时器将继续每毫秒触发一次。我认为加缪在他的回答中试图说的是,这个过程独立于帧率运行。它完全基于检查系统时钟和触发事件,以获得满足请求延迟的计时器。通过存储计时器启动时的系统时间,然后反复检查当前系统时间,直到其大于或等于保存的时间加上计时器延迟,从而对其进行内部验证。例如:

timer.start() //Lets say current system time is 1000
计时器持续时间为1000,因此我们需要在系统时间大于或等于2000时触发此计时器

checkTimers() //Loops, gets the current system

//If system time is greater than or equal to 2000, trigger timer with an event
dispatchEvent(Timer.TIME, etc, etc);
请注意,上面的“代码”只是演示系统基本原理的伪代码。

“enterFrame”
在每一帧上调度

假设您的SWF为24fps:
“enterFrame”
每秒最多调度24次

“计时器”
按设定的间隔调度

假设以50毫秒的延迟启动一个
计时器
“计时器”
每秒最多调度20次

这些事件的实际频率将取决于主机环境以及应用程序内部的情况。例如,如果在
“timer”
处理程序中有一个
For
循环,在该循环中迭代1000个元素的数组并对每个元素执行一些字符串操作,那么与数组仅包含10个元素相比,您可能会得到更少的
“timer”
事件。同样,如果用户系统的可用内存不足,Flash Player可能无法执行您的SWF,并且可能会减慢这些事件的调度速度

“enterFrame”
直接取决于帧速率<代码>“计时器”在某种程度上间接取决于帧速率

因为你(或其他人)总是会问我“多少间接地”是什么意思,这里有一个小型AS3应用程序可以测试这两个事件:

package
{

import flash.display.*;
import flash.events.*;
import flash.utils.*;

public class Test extends Sprite
{
    private var timer:Timer = null;
    private var timerEventCount:int = 0;
    private var enterFrameEventCount:int = 0;
    private var startTime:Number = 0;

    public function Test()
    {
        timer = new Timer(20, 0);
        timer.addEventListener("timer", timerHandler);
        timer.start();

        addEventListener("enterFrame", enterFrameHandler);

        startTime = new Date().time;
    }

    private function timerHandler(event:Event):void
    {
        timerEventCount++;

        var timeElapsed:Number = new Date().time - startTime;

        //for (var i:int = 0; i < 4000; i++)
        //  trace("i", i);

        if (timeElapsed >= 1000) {
            // Stop timer after 1 second.
            timer.stop();

            removeEventListener("enterFrame", enterFrameHandler);

            trace(timerEventCount + " timer events and "
                    + enterFrameEventCount + " enterFrame events in "
                    + timeElapsed + " milliseconds.");
        }
    }

    private function enterFrameHandler(event:Event):void
    {
        enterFrameEventCount++;
    }
}

}
输出:

45 timer events and 12 enterFrame events in 1001 milliseconds.
29 timer events and 58 enterFrame events in 1010 milliseconds.
3 timer events and 3 enterFrame events in 1145 milliseconds.
以每秒60帧的速度编译:

mxmlc Test.as -default-frame-rate=60
输出:

45 timer events and 12 enterFrame events in 1001 milliseconds.
29 timer events and 58 enterFrame events in 1010 milliseconds.
3 timer events and 3 enterFrame events in 1145 milliseconds.
如您所见,较高的帧速率实际上会减慢计时器的速度。我在Flash播放器调试器10.3.181.34(10.3)中运行这个;您的里程可能会有所不同

最后,如果您取消对
for
循环的注释,并以60fps再次运行它,您将看到我所说的内容

输出:

45 timer events and 12 enterFrame events in 1001 milliseconds.
29 timer events and 58 enterFrame events in 1010 milliseconds.
3 timer events and 3 enterFrame events in 1145 milliseconds.

对不起,你能稍微解释一下吗?我有点理解,但不确定什么定时器事件应该是绝对意义上的?谢谢你,这非常有帮助,也很容易理解!我看到你对这个网站很陌生,欢迎你,给我一个提示。。。投票给我的人!哈哈,别忘了给有用的答案投票这里有几个,如果你找到了一个你认为最好的答案,别忘了点击旁边的复选标记,将其标记为正确答案。很高兴我能帮忙。:)非常感谢,我现在理解了+1,因为它指出了actionscript执行仅在单个线程中运行这一事实所产生的问题。