0

我有一个用 AS3 编写的简单倒计时计时器,它随着时间的推移逐渐增加 CPU 使用和帧渲染时间,直到帧速率在 10 分钟内下降到每秒 2-3 帧。时间线有 1 帧,舞台有 4 个 tlf 文本区域,实例名称为 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();                                           
}
4

2 回答 2

1

TLF 文本字段非常昂贵,并且比常规文本字段具有显着的开销。

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

于 2013-10-16T19:35:33.037 回答
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审判早就结束了。)

于 2013-10-16T03:40:43.787 回答