0

我有大量对象(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();
    }   
}

注释掉由于问题而启动的计时器。

4

3 回答 3

2

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

于 2012-09-24T07:33:31.820 回答
1

考虑执行以下操作:

在顶部,导入 getTimer

import flash.utils.Timer;

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

var timerStart : int = getTimer();

而不是这样做: time.currentCount

只需这样做:

(getTimer() - timerStart) / 1000

祝你好运。

于 2012-09-24T09:17:23.073 回答
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 设置舞台。

您可以制作更多的“计时器”,但这取决于游戏的需求,但我确信它会比数百个计时器更快地工作。

于 2012-09-26T22:37:58.353 回答