AS3倒数计时器会随着时间的推移经历极端的帧速率损失

时间:2013-10-15 18:58:56

标签: actionscript-3 frame-rate enterframeevent adobe-scout

我有一个简单的倒计时器,用AS3编写,随着时间的推移逐渐增加CPU使用和帧渲染时间,在10分钟内帧速率下降到每秒2-3个。时间轴有1帧,舞台有4个文本区域,实例名称为HH MM SS和FF。代码基于与当前时间和“事件时间”的比较,每帧更新这些文本区域 我看了一下侦察兵,犯罪活动是“处理事件'渲染'”,占用了95%的活跃时间

以下代码

import flash.events.Event;
stop();

// ***Customization Point*** Enter the event date as (Year, Month - 1, day, 24Hr Hours,     Minutes -1, Seconds - 1)
var End:Date = new Date(2013, 9, 15, 12, 0, 0);

var Now:Date;
var HH:Number;
var MM:Number;
var SS:Number;
var FF:Number;
stage.addEventListener(Event.ENTER_FRAME, tick);

function tick(e:Event = null):void
{
Now = new Date();
HH = (End.day > Now.day) ? (End.hours - Now.hours + (24 * (End.day - Now.day))) : (End.hours - Now.hours);
MM = (End.minutes == 0)? 60 - Now.minutes : End.minutes - Now.minutes;
MM = (MM == 60)? 0 : MM;
HH = (MM < 0)? HH - 1 : HH - 1;
MM = (MM < 0)? -1 * MM : MM;

SS = (End.seconds == 0)? 60 - Now.seconds : End.seconds - Now.seconds;
SS = (SS == 60)? 0 : SS;
MM = (SS < 0)? MM - 1 : MM;
SS = (SS < 0)? -1 * SS : SS;

FF = 30 - Math.round(Now.milliseconds / 33.33);

F.text = (FF < 10) ? "0" + FF.toString() : FF.toString();
S.text = (SS < 10) ? "0" + SS.toString() : SS.toString();
M.text = (MM < 10) ? "0" + MM.toString() : MM.toString();
H.text = (HH < 10) ? "0" + HH.toString() : HH.toString();                                           
}

2 个答案:

答案 0 :(得分:1)

您为每个FRAME添加一个输入框架侦听器,这些构建并导致延迟。使它成为一个监听器添加一次(使用标志)。

var flag:Boolean; // default is false, but we don't want a value assigned HERE
if (!flag) {
    flag=true;
    stage.addEventListener(Event.ENTER_FRAME, tick);
}

更新:可能声明变量会重置其值,因此您可以尝试这样做:

if (!this["flag"]) {
    this["flag"]=true;
    stage.addEventListener(Event.ENTER_FRAME, tick);
}

更改消除了本地var,现在将状态保存在MovieClip实例上,因此它会持续存在。

如果这也无法解决问题,请尝试使用第一个示例static var flag:Boolean。 (就我个人而言,我不喜欢时间轴代码,因为它不能完全控制代码和数据流,所以它可能会引发各种Flash引擎问题。而且我没有工具来重现这个问题,我的Flash CS4审判很久了。)

答案 1 :(得分:1)

TLF TextFields非常昂贵,并且比常规TextFields有很大的开销。

因此,在可能的情况下,您应始终使用常规动态TextField。