2

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

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

4

2 回答 2

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(在屏幕上绘制位图)而不是在矢量中绘制或在屏幕上添加形状,那么我认为上面的内容实际上应该非常准确。

如果代码导致帧速率低于预期,您可以尝试一些简单的方法,例如只为一帧占用一半的分配时间,而将另一半留给 Flash 渲染:

_time_per_frame = 500 / stage.frameRate;

周围还有 FPS 监视器,您可以在绘图时使用它们来监视帧速率。谷歌as3 帧率监视器

于 2012-02-13T19:01:13.147 回答
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);
}
于 2012-02-13T18:30:30.467 回答