2013-12-09 2 views
2

Я понимаю, что для задержки таймера не рекомендуется находиться под 20, но у меня есть два таймера: один с одной миллисекундной задержкой, второй с 5000 (хотя это не имеет значения).Создать «действительный» таймер, не связанный с частотой кадров?

Я использую событие TIMER_TICK для первого таймера, поэтому я могу вычесть его currentCount со второго таймера delay (5000). Однако, поскольку таймеры в as3 привязаны к frameRate, и менее 20 миллисекундных задержек не рекомендуется, таймер гаснет намного медленнее.

Вопрос:

Есть ли способ как-то "развязать" его отношения с frameRate?

Я сделал исследования, чтобы помочь с ответом на этот вопрос и getTimer(), кажется, дает действительное число, когда я trace его. Так что я могу с этим поделать.

ответ

2

Печально то, что разработчики действительно не могут «развязать» таймер или подобные классы из частоты кадров.

Совершенно бесполезно иметь таймер с delay=1, так как он просто не срабатывает так часто. Таким образом, обновление кое-чего с интервалом, меньшим, чем частота кадров, не даст вам гарантированных результатов.

Вы можете узнать, сколько времени прошло с момента последнего обновления. Предположим, у вас есть эмуляция, где Sprite движется со скоростью 1px/ms. Пытается переместить Sprite, который быстро не удастся. Даже если он рассчитан достаточно быстро, монитор не будет обновлять экран так просто.

Но вы можете знать, сколько времени прошло для кода для выполнения в миллисекундах для перемещения спрайта, что количество пикселей на следующем обновлении:

var startTime:int = getTimer(); 

// YOUR CODE HERE 

var timePassed:int = getTimer() - startTime; // returns the amount of time spent on code execution 

Имейте в виду, что getTimer() начинает отсчет с виртуальной машины начал. http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/utils/package.html#getTimer()

Вот блог, написанный одним из инженеров Adobe Flash Player, объясняющих, почему это невозможно ориентироваться на маленькие промежутки времени и немного модели FP в целом: http://www.kaourantin.net/2006/05/frame-rates-in-flash-player.html

+0

большое, простое решение. Я действительно думаю, что Adobe должна изменить свои методы на frameRate ... – Cilan

+0

Я только что понял что-то действительно замечательное, что заставляет меня чувствовать себя глупо: 'setInterval' – Cilan

0

Вы не будете получать события таймера быстрее чем один раз за кадр, период. Вы действительно можете рассчитывать время, прошедшее через getTimer(), используя захват затем сравнить технику с помощью ввода кадров слушателя, как это:

var oldTime:int; 
addEventListener(Event.ENTER_FRAME, onEnterFrame); 
function onEnterFrame(e:Event):void { 
    var frameTime:int=getTimer()-oldTime; 
    oldTime=getTimer(); 
    // process frameTime 
} 

Имейте в виду, однако, это один поведение, который ненавидят в играх, то есть, если флэш-плеер будет отставание по какой-то причине, разница в getTimer() будет зависеть от того, что ваш игровой движок будет вести себя как много времени без каких-либо действий со стороны игрока, и в таких играх игрок должен реагировать в реальном времени, таким образом, игровой движок будет вероятно, реагируют на игру по ситуации в рамках одного кадра. Обходной путь заключается в том, чтобы ограничить временную разницу кадров с разумным значением, которое соответствует приличной частоте кадров, ниже которой вы не ожидаете, что ваша игра будет запущена в любых обстоятельствах (скажем, 10 кадров в секунду, 1000/10 = 100).

static const FRAME_CAP:int=100; 
if (frameTime>FRAME_CAP) frameTime=FRAME_CAP; 

PS: Я ожидаю, что истинная причина таймеров привязываясь к кадру скорости является то, что проверка таймера рутина теперь вызывается внутренне вместе с созданием ввести кадр или выход кадров события, которые затем распространяются через список всего дисплея , а фактическое время обновления для таймеров затем вычисляется точно через getTimer(), которые затем сравниваются с внутренним полем «следующего огня» таймеров, чтобы выполнить соответствующие события TIMER_TICK и обновить их с помощью getTimer()+delay.

0

Простое решение, которое я нашел использовал твин двигатель и прослушивание событий изменения:

http://www.gskinner.com/libraries/gtween/

+0

отличное решение, но, возможно, предоставить немного больше подробностей о событии с событием« Событие », чтобы помочь других пользователей? Замечательно, что вы говорили о ссылке, но она кажется немного широкой. Хотелось бы, чтобы я принял ваш ответ, но я нашел лучшую. – Cilan

Смежные вопросы