Таймер Flash AS3 крайне выключен - PullRequest
3 голосов
/ 21 октября 2010

Я использую Flash CS4 с AS3.Я хочу, чтобы таймер вызывал функцию с интервалами 50 мс 100 раз.однако таймер занимает намного больше времени, чем следует, что добавляет до 1677 мс (1,677 секунд!) слишком много после 100 повторений.Я что-то здесь упускаю или таймер ТАК неверен?

Код

function test(event:TimerEvent):void{
   trace("GetTimer(): " + getTimer() + " || Timer.currentCount: " + _timer.currentCount);
}

var _timer:Timer = new Timer(50, 100); 
_timer.addEventListener(TimerEvent.TIMER, test); 
_timer.start();

Вывод трассировки:

GetTimer(): 74 ||Timer.currentCount: 1

GetTimer (): 140 ||Timer.currentCount: 2

GetTimer (): 209 ||Timer.currentCount: 3

GetTimer (): 275 ||Timer.currentCount: 4

GetTimer (): 340 ||Timer.currentCount: 5

GetTimer (): 407 ||Timer.currentCount: 6

GetTimer (): 476 ||Timer.currentCount: 7

GetTimer (): 542 ||Timer.currentCount: 8

GetTimer (): 608 ||Timer.currentCount: 9

GetTimer (): 677 ||Timer.currentCount: 10

......

GetTimer (): 3340 ||Timer.currentCount: 50

......

GetTimer (): 6677 ||Timer.currentCount: 100

Спасибо за помощь.

С уважением,

Крис

Ответы [ 4 ]

8 голосов
/ 21 октября 2010

Не используйте Timer для таких небольших интервалов.Временные рамки во Flash - не простая тема, см. this для начала.Для измерения 50 мс я предлагаю функцию getTimer() и событие ENTER_FRAME, чтобы проверить, прошел ли временной интервал.

1 голос
/ 21 октября 2010

Множество факторов может повлиять на точность таймера. Частота кадров SWF, другие процессы, в основном общая среда для вашего фильма.

0 голосов
/ 26 октября 2010

Попробуйте использовать автокоррекцию таймера примерно так:

http://actualwave.com/blog/?p=484
http://cookbooks.adobe.com/post_Accurate_timer-17332.html

0 голосов
/ 21 октября 2010

на вашем месте я бы посчитал количество миллисекунд между кадрами (1000 / кадр / с) и решил бы вызывать функцию через каждое определенное количество кадров.эта сумма больше 1:

var counter:int = 0;
const COUNT_TO_INVOKE: int = 2;//if calling every 3 frames
function onEnterFrame(e: Event):void{
    counter++;
    if(counter == COUNT_TO_INVOKE){
        timerFunction();
        counter = 0; 
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...