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