AS3:大量定时器滞后闪存

时间:2012-09-24 07:05:59

标签: actionscript-3 flash optimization actionscript timer

我有大量的对象(472)需要一个定时器来检查变量状态变化之间需要多长时间。下面的代码是我到目前为止的,但许多运行的计时器肯定会影响应用程序的性能,是否有更好的测量方法?

import flash.utils.Timer;

var active_:Boolean;
var matched:Boolean;
var vacated:Boolean;

var circ:Shape=new Shape();
this.addChild(circ);
circ.x = 0;
circ.y = 0;
var circRad:Number = 5;
var mat= new Matrix();
var busyColors = [0xFFFF00,0xFFCC00];
var idleColors = [0xCCCCCC,0x000000];
var matchedColors = [0x0099FF,0x0066FF];
var vacatedColors = [0xFF0000,0x990000];
var busyAlphas = [1,1];
var idleAlphas = [0.5,0.5];
var ratios = [0,255];
var prev:int = 0;
var time:Timer = new Timer(1000,0);
//time.start();
mat.createGradientBox(2*circRad,2*circRad,0,-circRad,-circRad);
circ.graphics.lineStyle();
if (active_ == false)
{
    if (prev != 0)
    {
        setAverage(prev,false);
        prev = 0;
    }
    circ.graphics.clear();
    circ.graphics.beginGradientFill(GradientType.RADIAL,idleColors,idleAlphas,ratios,mat);
    circ.graphics.drawCircle(0,0,circRad);
    circ.graphics.endFill();
}
else if (active_ == true && matched == true)
{
    if (prev != 1)
    {
        setAverage(prev,true);
        prev = 1;
    }
    circ.graphics.clear();
    circ.graphics.beginGradientFill(GradientType.RADIAL,matchedColors,busyAlphas,ratios,mat);
    circ.graphics.drawCircle(0,0,circRad);
    circ.graphics.endFill();
}
else if (active_ == true && vacated == false && matched == false)
{
    if (prev != 2)
    {
        setAverage(prev,true);
        prev = 2;
    }
    circ.graphics.clear();
    circ.graphics.beginGradientFill(GradientType.RADIAL,busyColors,busyAlphas,ratios,mat);
    circ.graphics.drawCircle(0,0,circRad);
    circ.graphics.endFill();
}
else if (active_ == true && vacated == true)
{
    if (prev != 3)
    {
        setAverage(prev,true);
        prev = 3;
    }
    circ.graphics.clear();
    circ.graphics.beginGradientFill(GradientType.RADIAL,vacatedColors,busyAlphas,ratios,mat);
    circ.graphics.drawCircle(0,0,circRad);
    circ.graphics.endFill();
}

function setAverage(i:int, a:Boolean)
{
    time.stop();
    switch (i)
    {
        case 0 :
            break;

        case 1 :
            MovieClip(root).avgMat.push(uint(time.currentCount));
            break;

        case 2 :
            MovieClip(root).avgBusy.push(uint(time.currentCount));
            break;

        case 3 :
            MovieClip(root).avgVac.push(uint(time.currentCount));
            break;
    }
    if(a == true){
        //time.reset();
        //time.start();
    }   
}

由于问题,计时器开始注释。

3 个答案:

答案 0 :(得分:2)

您可以在您的对象上创建像“tick()”这样的公共函数,并从外部的1个常规计时器循环调用它。

答案 1 :(得分:1)

考虑执行以下操作:

在顶部,导入ge​​tTimer

import flash.utils.Timer;

创建一个包含开始时间的变量(而不是执行timer.start)执行此操作:

var timerStart : int = getTimer();

而不是这样做:time.currentCount

只需这样做:

(getTimer() - timerStart) / 1000
祝你好运。

答案 2 :(得分:0)

您可以使用EVENT FRAME类型的addEventListener更改所有计时器

var counter:Number = 0;
addEventListener(Event.ENTER_FRAME, counting);
function counting (e:Event):void
{
     counter++
}

因此计数器将在每一帧上递增。现在你必须找到fps。现在将fps乘以您希望计时器运行的时间。所以它应该是这样的:

var counter:Number = 0;
addEventListener(Event.ENTER_FRAME, counting);
function counting (e:Event):void
{
     counter++
     if(counter == 60) //60 fps means this line will run after 1 sec.
     {
          //do something
     }
     If(counter == 120) //60 fps; 2 sec
     {
          //do something
     }
}

此方法更准确,系统不会过载。当动画启动后需要延迟时,这可以特别帮助您使用addChild设置舞台。

你可以制作更多这种'计时器',但这取决于游戏的需求,但我确信它的工作速度比计时器的速度快。