1

いつも私を困惑させてきたものであり、今日でもそうですが、AS3のTimerクラスがミリ秒未満の数値に対して十分な速度で更新されないのはなぜですか?

Flashは最大で20ミリ秒ごとにタイマーの更新をプッシュできることを読んだことを思い出しているようです(推奨)-最近のゲーム用に作成したタイマーは50ミリ秒ごとに更新されますが、それでも苦労しています。ローカルでは正常に動作しますが、オンライン環境では動作しません。

私がここで間違っている特定の何かがありますか、それともFlashは、オンライン環境で小数点以下2桁の秒数を実行するのに十分な速度で更新することが本当にできないのですか?

繰り返しますが、これはローカルで正常に機能します。

タイマーの私のコードはここにあります:

package src.gameShared {

import flash.display.Sprite;
import flash.utils.Timer;
import flash.events.TimerEvent;
import src.main;


public class timer extends Sprite {

    private var _updateAmount:int = 50;                     // MUST give a whole number if divided by 1000 and less than 100. Recommended above 20. Gives 25, 40 or 50.
    private var _timer:Timer = new Timer(_updateAmount,0);
    private var _count:int = new int();

    public function startTimer():void{
        _timer.addEventListener(TimerEvent.TIMER, updateText, false, 0, true);
        _timer.start();
    }

    public function stopTimer():void{
        _timer.stop();
        // Add to score
    }

    private function updateText(e:TimerEvent):void{
        _count++
        dtf_txt.text = returnTime();
    }

    // The below will display double minutes, double seconds and double milliseconds. Most math is based around the double milliseconds.
    public function returnTime(_score:Boolean = false){
        /*
        ** Minutes takes _count and divides it by (1000/50) = 20 (_updateAmount being 50), to give the value of 1 per second. If _count is 20, this has run 20 times and thus 1000 miliseconds have passed
        ** So the int can be set to 1. Minutes then checks to see if there is 60 of them (60 seconds).
        ** Seconds does the same, except it "caps" at 60 before resetting
        */
        var _division:int = (1000/_updateAmount)

        var minutes:int = Math.floor(_count /_division / 60);
        // Second is 1000 miliseconds
        var seconds:int = Math.floor(_count /_division) % 60;
        var milseconds:int = new int();

        /* After how many ticks is it a second. So at 50, 20 ticks would be 100 so 1 second, but _count would only show 20. So we *5 to get 100.
        ** 100 = max num we want, divided by (1000 (1sec) divided by _updateAmount)
        ** 100/(1000/50) = 5. 5*20 (number of ticks at 50milli per sec) = 100 = what we want
        */
        var _getMil:Number = 100/(1000/_updateAmount)   // 5 (20 lots of _updateAmount per second, we want an update on every tick. We do *5 as 20 updates fits into 100 that way)
        // How many updates to fit into 1000 (1 sec), then divide it by 10 as we want a single digit result
        var _getSmallMil:Number = (1000/_updateAmount)/10   // 2 (20 lots of _updateAmount per second, we only want an update every 2nd for the whole number, so we half _count)

        _score == false ? milseconds = Math.floor(_count*_getMil) % 100 : milseconds = Math.floor(_count/_getSmallMil) % 10;
        // Easier to read code that does the same thing but isn't dynamic:
        // _score == false ? milseconds = Math.floor(_count*5) % 100 : milseconds = Math.floor(_count/2) % 10;

        var secString:String = (seconds < 10) ? ("0" + String(seconds)) : String(seconds);
        var minString:String = (minutes < 10) ? ("0" + String(minutes)) : String(minutes);

        if(_score){
            var milString:String = String(milseconds);
            if(minutes >= 1){
                var _holder:int = int(secString);
                _holder = _holder + (minutes*60);
                secString = String(_holder);
            }
            return secString+"."+milString;
        }
        else{
            var milString:String = (milseconds < 10) ? ("0" + String(milseconds)) : String(milseconds);
            return minString+":"+secString+":"+milString;
        }

    }

}

}

4

3 に答える 3

7

タイマーは、アニメーション化されていないコンテンツに最適です。ただし、ビジュアルランタイムとして、フレームレートを超えて計算しないのは論理的です。

1秒あたり60フレームをターゲットにすることは、現実的な上限です。

フラッシュ弾性競馬場に関する素晴らしい記事があります。

弾性競馬場

マーシャルスライス

マーシャルスライス

参考文献

于 2012-07-30T01:50:18.800 に答える
1

フレームレートを上げてみてください。ASの実行は依然としてフレームに関連付けられているため、フレームレートがタイマー間隔に対して低すぎる場合は、粒度の問題が発生します。

于 2012-07-30T01:25:50.710 に答える
0

さらに、timerEventのupdateAfterEventを介してグラフィックを更新しませんでした...

private function updateText(e:TimerEvent):void{
       _count++
       dtf_txt.text = returnTime();
       e.updateAfterEvent();
   }

// e.updateAfterEvent(); 
于 2012-07-31T07:32:12.347 に答える