2016-09-10 6 views
0

Ich arbeite an einem AS3-Projekt und für einen der Effekte verwende ich Timer, um die Farben zu wechseln und dann zu stoppen. Die Funktion ist unten.Timer Effizienz

//global variable 
    private var valueAnimationTimer:Timer = new Timer(50); 
    //constructor 
    valueAnimationTimer.addEventListener(TimerEvent.TIMER, scrollUp); 
    //function 
    private function scrollUp(e:TimerEvent):void 
      { 

       var i:int = e.currentTarget.currentCount as int; 
       if (i < 10) 
       { 
        if (colored){ 
         if (i % 2 == 0){ 
          ChangeColor(ico, flickerColor); 
         } 
         else{ 
          ico.transform.colorTransform = new ColorTransform(); 
         } 
        } 
        tfValue.y -= 7.5; 
       } 
       else 
       { 
        RemoveFilters(ico); 
        tfValue.y = ico.height/2; 
        e.currentTarget.reset(); 
        RemoveSprite(tfValue); 
        colored = false; 
       } 
      } 

Jedes Zeichen (Objekt) hat seine eigene Version dieser Funktion ist, und es geschieht zu unterschiedlichen Zeiten (wie wenn sie verletzt oder vergiftet). Der Listener wird einmal im Konstruktor hinzugefügt, er wird nur entfernt, wenn der Charakter stirbt und von der Bühne entfernt wird. Das Problem hier ist, nachdem der Timer für mindestens 3 Zeichen verwendet wird, beginnt die Bildrate zu fallen. Jedes Mal, wenn die Funktion aufgerufen wird, fällt die Bildrate immer niedriger ab.

Was ich nicht verstehe, ist, wenn der Timer gestoppt wird, und die Listener nur einmal hinzugefügt werden, so dass es den Stapel nicht überlädt, warum beginnt die Framerate dann nach dem Hörer tatsächlich zu sinken? Es läuft nicht immer nur für eine kurze Zeit, aber es passiert immer wieder. Wenn die Bildrate abfällt, beginnt das gesamte Programm schlecht zu verzögern und schließlich zu frieren. Ich habe keine Ahnung, was die Ursache dieses

+2

Timer Zuhörer sind ein ziemlich ineffizienter Weg Timing in den Spielen zu handhaben. Es ist viel besser, eine einzelne Spielschleife zu haben, die jeden Zyklus überprüft, wenn etwas aktualisiert werden muss. Mit Timern können Sie mehrere Zuhörer in einem Spielzyklus feuern und wenn Sie so viele Charaktere eingerichtet haben, belastet dies den Spieler. – xxbbcc

+0

Ich verstehe. Ich schaute durch einen anderen Forum-Thread und jemand sagte, dass AS3 kann so etwas wie 50-100 + Objekte und ihre Ereignisse leicht handhaben, so dass ich dachte, alles wäre dandy. Danke :) –

+0

Wie effizient ist der Event.ENTER_FRAME Listener? Würde AS3 damit besser umgehen können? –

Antwort

0

Beachten Sie auch, dass innerhalb der Timer-Funktion, die erste Zahl ist Ihre Zählung in Millisekunden und die zweite ist Wiederholungszahl

var fl_TimerInstance:Timer = new Timer(240000, 1); 

Also das obige Beispiel ist ein 4 Minuten-Timer, die 1mal

wiederholt ich das bringen, weil Sie für 50 Millisekunden eingestellt ist, der sehr schnell ist lol