2012-03-10 34 views

回答

0

ENTER_FRAME是相对于电影的帧速率。 TIMER事件应该是绝对的。

+0

对不起,你将能够稍微详细点吗?我有点理解但不确定什么TIMER事件应该是绝对的手段? – user1256106 2012-03-10 19:35:50

5

定时器事件可以派遣独立的SWF(一个点)的帧率。它们可能比ENTER_FRAME事件发生得更频繁或经常发生,如果您关心计算的精确度,那么它们应该在ENTER_FRAME覆盖的时间范围内发生。最常见的用例是物理引擎,您可能希望尽可能精确,因此希望以比Flash的fps更快的速度执行仿真。

此外,计时器可以,如果你想要一个给定延迟后发生的具体行动是有益的。例如,一个定时器可以让你在10秒后轻松地执行一个动作。您只需将10000毫秒传递到您的Timer的构造函数中,然后在10秒钟后调度Timer事件。如果您要使用ENTER_FRAME,您需要手动跟踪每次帧更新所用的时间,如果您想知道何时过去了10秒。

ENTER_FRAME事件联系在一起的时间表或多或少符合您所指定的帧速率的渲染周期。例如,如果你的帧频为30fps,那么你将每秒收到大约30个ENTER_FRAME事件。如果你有一个特别复杂的显示列表,或者如果你的逻辑需要特别长的时间来执行,你可能会收到更少。

+0

非常感谢,我现在明白了 – user1256106 2012-03-10 20:22:35

1

ENTER_FRAME是触发每次运行虚拟机的呈现循环的事件,这是相对于影片的帧速率。例如,在Flash CS IDE中,如果将帧速率设置为30,则从根显示对象或阶段开始,每秒会触发30个ENTER_FRAME事件。

在另一方面,计时器,只是,一个计时器。它完全基于系统时钟运行。例如,如果您设置延时为1毫秒的计时器,那么该计时器将在启动后启动一毫秒,并且如果启用它将每隔一毫秒继续触发一次。我认为camus在他的回答中试图说的是,这个过程独立于帧速率运行。它仅基于检查系统时钟并触发已满足请求延迟的定时器的事件。这是通过存储定时器启动的系统时间,然后重复检查当前系统时间,直到它大于或等于保存时间PLUS定时器延迟来验证的。例如:

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); 

注触发此计时器的是,上述的“代码”只是伪代码来演示系统的基本原理。

+1

谢谢,这是非常有帮助和容易理解! – user1256106 2012-03-10 20:22:24

+0

我看到你对这个网站很新颖,欢迎并且只是一个提示... upvote我的男人!哈哈不要忘记在这里提供有用的答案这里有一对夫妇,如果你找到一个你找到最好的答案,不要忘记点击它旁边的复选标记,将其标记为正确的答案。很高兴我能帮上忙。 :) – 2012-03-10 20:27:01

2

"enterFrame"被分派到每一帧。

假设您的SWF为24fps:"enterFrame"将每秒调度24次。

"timer"按设定的时间间隔进行调度。

假设你开始Timer延迟50毫秒:"timer"将被调度每秒最多20次。

这些事件的实际频率将取决于主机环境,以及正在发生的事情在你的应用程序中。举例来说,如果你有你的"timer"处理器内for的循环,你遍历一个1000个元素的数组,每个元素上执行某些字符串操作,那么你可能会得到更少的"timer"事件比,如果您的阵列只包含10个元素。同样,如果用户的系统空闲内存不足,则Flash Player可能在执行SWF时遇到问题,并且可能会降低调度这些事件的速度。

"enterFrame"直接取决于帧速率。 "timer"在某种程度上取决于帧速率。

因为您(或他人),都会不约而同地问我的意思是“有点间接的,”这是一个测试这两个事件小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++; 
    } 
} 

} 

编译在12FPS:

mxmlc Test.as -default-frame-rate=12 

输出:

45 timer events and 12 enterFrame events in 1001 milliseconds. 

编译在60fps:

mxmlc Test.as -default-frame-rate=60 

输出:

29 timer events and 58 enterFrame events in 1010 milliseconds. 

正如你所看到的,更高的帧速率实际上减慢了计时器。我在Flash Player Debugger 10.3.181.34(10.3)中运行这个;你的旅费可能会改变。

最后,如果你取消注释for回路上与60fps的再次运行它,你就会明白我在说什么。

输出:

3 timer events and 3 enterFrame events in 1145 milliseconds. 
+1

+1用于指出动作执行只能在单个线程中运行的事实。 – 2012-03-10 21:57:11

相关问题