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 に答える