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

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

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

Ответы [ 2 ]

4 голосов
/ 13 февраля 2012

Если вы хотите, чтобы ваше приложение работало со скоростью 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 .

0 голосов
/ 13 февраля 2012

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

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