AS3 - сколько времени до следующего кадра / рисования экрана

У меня есть приложение для генеративного искусства, и я хотел бы, чтобы оно рисовало как можно больше циклов в каждом кадре, не уменьшая частоту кадров. Есть ли способ узнать, сколько времени осталось до обновления / обновления экрана?

Я полагаю, что если я могу приблизить, сколько миллисекунд занимает каждый цикл, то я могу выполнять циклы до тех пор, пока оставшееся время не станет меньше среднего значения или времени пикового цикла, затем позволить экрану обновиться, а затем выполнить другой набор циклов.

2 ответа

Решение

Если вы хотите, чтобы ваше приложение работало со скоростью N кадров в секунду, вы можете нарисовать цикл в течение 1/N секунд *, где N - это, как правило, частота кадров на этапе (которую вы можете получить и установить):

import flash.utils.getTimer;
import flash.events.Event;

private var _time_per_frame:uint;

... Где-то в вашем главном конструкторе:

stage.frameRate = 30;
_time_per_frame = 1000 / stage.frameRate;
addEventListener(Event.ENTER_FRAME, handle_enter_frame);

...

private function handle_enter_frame(e:Event):void
{
  var t0:uint = getTimer();

  while (getTimer()-t0 < _time_per_frame) {
    // ... draw some stuff
  }
}
  • Обратите внимание, что это несколько упрощает и может привести к более медленной результирующей частоте кадров, чем указано stage.frameRate, поскольку Flash требуется некоторое время для выполнения рендеринга между кадрами. Но если вы бьете (рисуете на растровое изображение на экране), а не рисуете в векторе или добавляете фигуры на экран, то я думаю, что вышеупомянутое должно быть довольно точным.

Если код приводит к более медленным, чем желаемое, частоте кадров, вы можете попробовать что-то такое же простое, как если взять только половину отведенного времени для кадра, оставив другую половину для Flash для рендеринга:

_time_per_frame = 500 / stage.frameRate;

Есть также мониторы FPS, которые вы можете использовать для контроля частоты кадров во время рисования. Google as3 монитор частоты кадров.

Поместите этот код в основной объект и проверьте - он будет отслеживать время между каждым началом кадра.

addEventListener(Event.ENTER_FRAME , oef);
var step:Number = 0;
var last:Number = Date.getTime();
function oef(e:Event):void{
    var time:Number = Date.getTime();
    step = time - last;
    last = time;

    trace(step);
}
Другие вопросы по тегам