"enterFrame"
отправляется на каждый кадр.
Предположим, ваш SWF составляет 24 кадра в секунду: "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++;
}
}
}
Компиляция со скоростью 12 кадров в секунду:
mxmlc Test.as -default-frame-rate=12
Выход:
45 timer events and 12 enterFrame events in 1001 milliseconds.
Компиляция со скоростью 60 кадров в секунду:
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.