AS3 - 下一帧/屏幕绘制的时间

时间:2012-02-13 17:05:56

标签: actionscript-3 frame-rate generative-art

我有一个生成艺术应用程序,我希望每帧绘制尽可能多的周期而不降低帧率。有没有办法告诉屏幕更新/刷新前剩下多少时间?

我想如果我可以估算每个周期花费多少毫秒,那么我可以运行循环直到剩余的时间量小于平均值或峰值循环时间,然后让屏幕刷新,然后运行另一组循环

2 个答案:

答案 0 :(得分:4)

如果您希望您的应用以每秒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需要一些时间在帧之间执行渲染。但是如果你是blitting(绘制到屏幕上的Bitmap)而不是绘制矢量或将Shapes添加到屏幕上,那么我认为上面的内容应该非常准确。

如果代码产生的帧速率低于预期,你可以尝试一些简单的事情,只需花费一半时间用于帧,另一半用于Flash渲染:

_time_per_frame = 500 / stage.frameRate;

周围还有FPS显示器可用于在绘图时监控帧速率。 Google as3 framerate monitor

答案 1 :(得分:0)

将此代码放入主对象并检查 - 它将跟踪每个帧开始之间的时间。

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