AS3: Quelle est la précision de la getTimer() la méthode et la classe Timer?

Je suis en train de faire un jeu (un shmup) et j'ai commencé à remettre en question l'exactitude des compteurs dans ActionScript. Bien sûr, ils sont assez précis quand vous voulez à la fois, les choses de l'ordre de quelques secondes ou dixièmes de s., mais il semble fonctionner assez mal lorsque vous obtenir plus fine de la plages de. Il est donc assez difficile de faire des choses comme avoir un vaisseau spatial de tir d'une centaine de lasers par seconde.

Dans l'exemple suivant, j'ai testé combien de temps (en moyenne), les intervalles entre 1000 minuterie tiques destinés à 30ms. Encore une fois, les résultats sont ~35-36 ms. En diminuant le temps, j'ai trouvé le sol de la minuterie de retard à ~16-17ms. Cela me donne un max de fps de ~60, ce qui est très visuel, mais aussi les moyens, je ne peux pas tirer plus de 60 lasers par seconde :-(. J'ai couru ce test quelques fois au 100 et 1000 boucles, mais pour le 30ms test et la 1ms tester les résultats n'ont pas changé. J'ai l'impression d'un champ de texte à la fin parce que l'aide de la fonction trace() et à lancer le fichier swf dans le mode de débogage semble affecter négativement le test. Donc, ce que je me pose, c'est:

  • Est ce test, un décent mesure de la classe Timer, ou mes résultats sont douteux?
  • Ces résultats de changer de façon spectaculaire sur d'autres machines?

Je comprends cela dépend de la getTimer() la méthode la précision, mais les discussions que j'ai trouver sur ce sujet généralement le centre autour de getTimer()'s précision sur des intervalles plus grands.

paquet 
{
 
import flash.d'affichage.Sprite; 
import flash.les événements.TimerEvent; 
import flash.texte.TextField; 
import flash.utils.getTimer; 
import flash.utils.Minuterie;

public class testTimerClass extends Sprite
{
    private var testTimer:Timer = new Timer(30, 1000);
    private var testTimes:Array = new Array();
    private var testSum:int = 0;
    private var testAvg:Number;
    private var lastTime:int;
    private var thisTime:int;

    public function testTimerClass()
    {
        testTimer.addEventListener(TimerEvent.TIMER, step);
        testTimer.addEventListener(TimerEvent.TIMER_COMPLETE, printResults);
        lastTime = getTimer();
        testTimer.start();
    }

    private function step(event:TimerEvent):void
    {
        thisTime = getTimer();
        testTimes.push(thisTime - lastTime);
        lastTime = thisTime;
    }

    private function printResults(event:TimerEvent):void
    {
        while (testTimes.length > 0)
        {
            testSum += testTimes.pop();
        }
        testAvg = testSum / Number(testTimer.repeatCount);              
        var txtTestResults:TextField = new TextField();
        txtTestResults.text = testAvg.toString();
        this.addChild(txtTestResults);  
    }       
}

}

Je suppose que la meilleure route à prendre serait de simplement dessiner plusieurs lasers dans le même cadre avec différentes positions et éviter d'avoir plus d'un objet Timer.

edit: j'ai utilisé de la scène.frameRate pour modifier le rendu de frameRate et a couru le test sur plusieurs fréquences d'images, mais il n'y a pas eu de changement.

Le manque de précision est un peu gênant, mais je parie que vous aurez d'autres, de façon pire des problèmes de performances si vous le feu jusqu'à 60 images par seconde. Juste une chose à garder à l'esprit.

OriginalL'auteur jorelli | 2009-06-18