Minimieren der CPU-Auslastung

Bei den Optimierungsbestrebungen muss auch der CPU-Auslastung Beachtung eingeräumt werden. Die Optimierung der CPU-Verarbeitung verbessert die Leistung und verlängert damit die Akkulaufzeit auf Mobilgeräten.

Verbesserungen der CPU-Auslastung in Flash Player 10.1

In Flash Player 10.1 stehen zwei neue Funktionsmerkmale zur Verfügung, mit denen die CPU-Verarbeitungsleistung verbessert werden kann. Zu den Funktionen gehören das Anhalten und Fortsetzen von SWF-Inhalten, wenn sie sich außerhalb des Bildschirms befinden, und die Begrenzung der Anzahl Flash Player-Instanzen auf einer Seite.

Anhalten, Drosseln und Fortsetzen

Hinweis: Die Funktionalität für das Anhalten, Drosseln und Fortsetzen gilt nicht für Adobe® AIR®-Anwendungen.

Zur Optimierung der CPU- und Akkuauslastung steht in Flash Player 10.1 ein neues Funktionsmerkmal für inaktive Instanzen zur Verfügung. Mit diesem Funktionsmerkmal können Sie die CPU-Auslastung verringern, indem Sie eine SWF-Datei anhalten und wieder starten, wenn der Inhalt auf dem Bildschirm ein- oder ausgeblendet wird. Flash Player gibt dabei so viel Arbeitsspeicher wie möglich frei, indem Objekte entfernt werden, die neu erstellt werden können, wenn das Abspielen des Inhalts fortgesetzt wird. Der Inhalt muss vollständig vom Bildschirm ausgeblendet sein, damit er als nicht auf dem Bildschirm befindlich (offscreen) betrachtet wird.

In zwei Fällen gilt SWF-Inhalt als offscreen:

  • Der Benutzer führt einen Bildlauf auf der Seite durch, wodurch der SWF-Inhalt offscreen verschoben wird.

    Wenn in diesem Fall Audio oder Video abgespielt wird, wird der Inhalt zwar weiter abgespielt, aber das Rendern wird gestoppt. Wenn kein Audio oder Video abgespielt wird, stellen Sie den HTML-Parameter hasPriority auf „true“ ein, um sicherzustellen, dass die Wiedergabe oder die ActionScript-Ausführung nicht angehalten wird. Beachten Sie jedoch, dass das Rendern von SWF-Inhalt angehalten wird, wenn Inhalt ausgeblendet oder offscreen ist, unabhängig vom Wert des HTML-Parameters hasPriority .

  • Im Browser wird eine Registerkarte geöffnet, wodurch der SWF-Inhalt in den Hintergrund verschoben wird.

    In diesem Fall wird der SWF-Inhalt auf eine Geschwindigkeit zwischen 2 und 8 fps verlangsamt, oder gedrosselt , unabhängig vom Wert des HTML-Tags hasPriority . Die Wiedergabe von Audio und Video wird gestoppt und das Rendern von Inhalt wird nicht verarbeitet, es sei denn, der SWF-Inhalt wird wieder sichtbar.

Für Flash Player 11.2 und höher in Windows- und Mac-Desktopbrowsern können Sie das ThrottleEvent in Ihrer Anwendung verwenden. Flash Player setzt ein ThrottleEvent ab, wenn Flash Player die Wiedergabe anhält, drosselt oder fortsetzt.

Bei ThrottleEvent handelt es sich um ein broadcast-Ereignis. Das bedeutet, dass es von allen EventDispatcher-Objekten ausgelöst wird, die einen Listener für dieses Ereignis registriert haben. Weitere Informationen zu brodcast-Ereignissen finden Sie im Abschnitt zur DisplayObject -Klasse.

Instanzverwaltung

Hinweis: Die Instanzverwaltungsfunktion gilt nicht für Adobe® AIR®-Anwendungen.
Mit dem HTML-Parameter hasPriority kann das Laden von SWF-Dateien, die offscreen sind, verzögert werden.

Ab Flash Player 10.1 steht der neue HTML-Parameter hasPriority zur Verfügung:

<param name="hasPriority" value="true" />

Dieses Funktionsmerkmal begrenzt die Anzahl der Flash Player-Instanzen, die auf einer Seite gestartet werden. Durch das Begrenzen der Instanzenanzahl werden CPU-Ressourcen und Batterieverbrauch eingespart. Damit kann dem SWF-Inhalt eine bestimmte Priorität im Vergleich mit anderem Inhalt auf der Seite zugewiesen werden. Ein einfaches Beispiel: Ein Benutzer navigiert in einer Website, deren Indexseite drei verschiedene SWF-Dateien umfasst. Eine dieser Dateien ist sichtbar, eine andere ist nur teilweise auf dem Bildschirm sichtbar und die dritte ist offscreen und erfordert einen Bildlauf. Die ersten beiden Animationen werden normal gestartet, aber die letzte wird verzögert, bis sie sichtbar wird. Dies ist das Standardverhalten, wenn der hasPriority -Parameter nicht vorhanden ist oder auf false eingestellt ist. Um sicherzustellen, dass eine SWF-Datei auch dann gestartet wird, wenn sie offscreen ist, setzen Sie den hasPriority -Parameter auf true . Doch unabhängig vom Wert des hasPriority -Parameters wird das Rendern einer SWF-Datei immer angehalten, wenn diese für den Anwender nicht sichtbar ist.

Hinweis: Wenn nur noch wenig CPU-Ressourcen zur Verfügung stehen, werden Flash Player-Instanzen nicht mehr automatisch gestartet, selbst wenn der hasPriority -Parameter auf true eingestellt ist. Wenn nach dem Laden der Seite neue Instanzen über JavaScript erstellt werden, ignorieren diese Instanzen das hasPriority -Flag. Inhalt mit 1x1 Pixel oder 0x0 Pixel wird gestartet, wodurch verhindert wird, dass SWF-Helferdateien verzögert werden, wenn der Webmaster das hasPriority -Flag nicht angibt. SWF-Dateien können jedoch nach wie vor durch Klicken gestartet werden. Dieses Verhalten wird als „Zum Abspielen klicken“ (click to play) bezeichnet.

In den folgenden Abbildungen werden die Auswirkungen verschiedener Werte des hasPriority -Parameters gezeigt:

Auswirkungen verschiedener Werte des hasPriority-Parameters

Auswirkungen verschiedener Werte des hasPriority-Parameters

Ruhemodus

In Flash Player 10.1 und AIR 2.5 wird eine neue Funktion auf mobilen Geräten eingeführt, die die CPU-Auslastung reduziert und damit auch die Akkuverwendung. Dieses Funktionsmerkmal betrifft die Hintergrundbeleuchtung, die zahlreiche Mobilgeräte bieten. Wenn beispielsweise ein Benutzer bei der Ausführung einer mobilen Anwendung unterbrochen wird und das Gerät nicht mehr benutzt, erkennt die Laufzeitumgebung, wenn die Hintergrundbeleuchtung in den Ruhemodus schaltet. Daraufhin reduziert Flash Player die Bildrate auf 4 fps (Bilder pro Sekunde) und hält das Rendern an. Bei AIR-Anwendungen beginnt auch der Energiesparmodus, wenn die Anwendung in den Hintergrund wechselt.

Der ActionScript-Code wird im Ruhemodus weiter ausgeführt, ähnlich wie beim Einstellen der Stage.frameRate -Eigenschaft auf 4 fps. Der Schritt zum Rendern wird jedoch übersprungen, sodass der Benutzer nicht sehen kann, dass der Player mit 4 fps weiter läuft. Die Bildrate von 4 fps anstelle von Null wurde gewählt, da so alle Verbindungen geöffnet bleiben können (NetStream, Socket und NetConnection). Beim Wechseln auf Null würden geöffnete Verbindungen unterbrochen. Außerdem wurde eine Bildwiederholfrequenz von 250 ms (4 fps) gewählt, da dieser Wert von zahlreichen Geräteherstellern verwendet wird. Mit diesem Wert bleibt auch die Bildrate der Laufzeitumgebung ungefähr im selben Bereich wie die des Geräts.

Hinweis: Wenn sich die Laufzeitumgebung im Energiesparmodus befindet, gibt die Stage.frameRate -Eigenschaft die Bildrate der ursprünglichen SWF-Datei zurück und nicht 4 fps.

Bei erneuter Aktivierung der Hintergrundbeleuchtung wird das Rendern fortgesetzt, und die Bildrate wird wieder auf den ursprünglichen Wert gesetzt. Nehmen wir als Beispiel eine Media-Player-Anwendung, in der Musik abgespielt wird. Wenn der Bildschirm in den Energiesparmodus wechselt, richtet sich die Reaktion der Laufzeitumgebung nach dem Typ des Inhalts, der gerade abgespielt wird. Die folgende Liste führt verschiedene Situationen mit dem entsprechenden Verhalten der Laufzeitumgebung auf:

  • Die Hintergrundbeleuchtung wechselt in den Energiesparmodus und Inhalt ohne A/V wird abgespielt: Das Rendering wird angehalten und die Bildrate wird auf 4 fps gesetzt.

  • Die Hintergrundbeleuchtung wechselt in den Ruhemodus und A/V-Inhalt wird abgespielt: Die Laufzeitumgebung erzwingt, dass die Hintergrundbeleuchtung immer eingeschaltet bleibt, sodass der Benutzer den abgespielten Inhalt weiter sehen kann.

  • Die Hintergrundbeleuchtung wird aus dem Ruhemodus wieder aktiviert: Die Laufzeitumgebung stellt die Bildrate auf die ursprüngliche Einstellung der SWF-Datei ein und setzt das Rendern fort.

  • Flash Player wird angehalten, während A/V-Inhalt abgespielt wird: Flash Player setzt den Status der Hintergrundbeleuchtung auf das Standardsystemverhalten zurück, da der A/V-Inhalt nicht mehr abgespielt wird.

  • Das mobile Gerät empfängt einen Telefonanruf, während A/V-Inhalt abgespielt wird: Das Rendering wird angehalten und die Bildrate wird auf 4 fps gesetzt.

  • Der Ruhemodus für die Hintergrundbeleuchtung wird auf dem Mobilgerät deaktiviert: Die Laufzeitumgebung zeigt das Standardverhalten.

Wenn die Hintergrundbeleuchtung in den Ruhemodus wechselt, wird das Rendering angehalten und die Bildrate reduziert. Dieses Funktionsmerkmal spart zwar CPU-Ressourcen, führt aber nicht zuverlässig eine echte Pause herbei, wie in einem Spiel.

Hinweis: Es wird kein ActionScript-Ereignis abgesetzt, wenn die Laufzeitumgebung in den oder aus dem Ruhemodus wechselt.

Fixieren und Freigeben von Objekten

Mithilfe der Ereignisse REMOVED_FROM_STAGE und ADDED_TO_STAGE können Sie Objekte ordnungsgemäß fixieren und wieder freigeben (ihre Fixierung wieder aufheben).

Zur Optimierung des Codes empfiehlt es sich, Objekte immer zu fixieren und wieder freizugeben. Das Fixieren und Freigeben ist für alle Objekte wichtig, ganz besonders jedoch für Anzeigeobjekte. Selbst wenn Anzeigeobjekte nicht mehr in der Anzeigeliste enthalten sind und auf die Speicherbereinigung warten, können sie immer noch CPU-lastigen Code nutzen, beispielsweise Event.ENTER_FRAME. Deshalb ist es äußerst wichtig, Objekte mithilfe der Ereignisse Event.REMOVED_FROM_STAGE und Event.ADDED_TO_STAGE ordnungsgemäß zu fixieren und freizugeben. Das folgende Beispiel zeigt einen Movieclip, der auf der Bühne abgespielt wird und eine Interaktion mit der Tastatur aufweist:

// Listen to keyboard events 
stage.addEventListener(KeyboardEvent.KEY_DOWN, keyIsDown); 
stage.addEventListener(KeyboardEvent.KEY_UP, keyIsUp); 
  
// Create object to store key states 
var keys:Dictionary = new Dictionary(true); 
  
function keyIsDown(e:KeyboardEvent):void 
{ 
    // Remember that the key was pressed 
    keys[e.keyCode] = true;     
  
    if (e.keyCode==Keyboard.LEFT || e.keyCode==Keyboard.RIGHT) 
    { 
        runningBoy.play(); 
    } 
} 
  
function keyIsUp(e:KeyboardEvent):void 
{ 
    // Remember that the key was released 
    keys[e.keyCode] = false; 
  
    for each (var value:Boolean in keys) 
          if ( value ) return; 
    runningBoy.stop(); 
} 
  
runningBoy.addEventListener(Event.ENTER_FRAME, handleMovement); 
runningBoy.stop(); 
  
var currentState:Number = runningBoy.scaleX; 
var speed:Number = 15; 
  
function handleMovement(e:Event):void 
{ 
    if (keys[Keyboard.RIGHT]) 
    { 
        e.currentTarget.x += speed; 
        e.currentTarget.scaleX = currentState;     
    } else if (keys[Keyboard.LEFT]) 
    { 
        e.currentTarget.x -= speed; 
        e.currentTarget.scaleX = -currentState; 
    } 
}

Grafik in Originalgröße anzeigen
Movieclip, der eine Interaktion mit der Tastatur aufweist

Beim Klicken auf die Schaltfläche „Entfernen“ wird der Movieclip aus der Anzeigeliste entfernt:

// Show or remove running boy 
showBtn.addEventListener (MouseEvent.CLICK,showIt); 
removeBtn.addEventListener (MouseEvent.CLICK,removeIt); 
 
function showIt (e:MouseEvent):void 
{ 
    addChild (runningBoy); 
} 
 
function removeIt(e:MouseEvent):void 
{ 
    if (contains(runningBoy)) removeChild(runningBoy); 
}

Auch nach dem Entfernen aus der Anzeigeliste löst der Movieclip noch das Event.ENTER_FRAME -Ereignis aus. Der Movieclip wird noch abgespielt, aber nicht gerendert. Um diese Situation richtig zu handhaben, muss Ihr Code auf die jeweiligen Ereignisse warten und Ereignis-Listener entfernen, damit CPU-lastiger Code nicht ausgeführt wird:

// Listen to Event.ADDED_TO_STAGE and Event.REMOVED_FROM_STAGE 
runningBoy.addEventListener(Event.ADDED_TO_STAGE,activate); 
runningBoy.addEventListener(Event.REMOVED_FROM_STAGE,deactivate); 
 
function activate(e:Event):void 
{ 
    // Restart everything 
    e.currentTarget.addEventListener(Event.ENTER_FRAME,handleMovement); 
} 
 
function deactivate(e:Event):void 
{ 
    // Freeze the running boy - consumes fewer CPU resources when not shown 
    e.currentTarget.removeEventListener(Event.ENTER_FRAME,handleMovement); 
    e.currentTarget.stop(); 
}

Beim Klicken auf die Schaltfläche „Anzeigen“ wird der Movieclip neu gestartet und wartet erneut auf die Event.ENTER_FRAME -Ereignisse. Der Movieclip wird korrekt von der Tastatur gesteuert.

Hinweis: Wenn Sie ein Anzeigeobjekt aus der Anzeigeliste entfernen und danach seinen Verweis auf null setzen, ist nicht gewährleistet, dass das Objekt fixiert wird. Wenn die Speicherbereinigung nicht ausgeführt wird, belegt das Objekt weiterhin Arbeitsspeicher und CPU-Ressourcen, obwohl es nicht mehr angezeigt wird. Sie sollten das Objekt beim Entfernen aus der Anzeigeliste vollständig fixieren, um sicherzustellen, dass es so wenig CPU-Ressourcen wie möglich beansprucht.

Ab Flash Player 10 und AIR 1.5 tritt auch das folgende Verhalten auf. Das Anzeigeobjekt wird automatisch fixiert, wenn der Abspielkopf ein leeres Bild erreicht, selbst wenn Sie kein spezifisches Fixierungsverhalten implementiert haben.

Das Fixieren ist auch beim Laden von Remote-Inhalt mit der Loader-Klasse von Bedeutung. Bei Verwendung der Loader-Klasse mit Flash Player 9 und AIR 1.0 war es notwendig, Inhalt manuell zu fixieren, indem ein Listener für das Event.UNLOAD -Ereignis verwendet wurde, das vom LoaderInfo-Objekt abgesetzt wurde. Jedes Objekt musste manuell fixiert werden, was mit einem hohen Arbeitsaufwand verbunden war. In Flash Player 10 und AIR 1.5 wurde eine wichtige neue Methode für die Loader-Klasse eingeführt: unloadAndStop() . Mit dieser Methode können Sie eine SWF-Datei entladen, automatisch jedes Objekt in der geladenen SWF-Datei fixieren und die Speicherbereinigung erzwingen.

Im folgenden Code wird die SWF-Datei geladen und dann mithilfe der unload() -Methode entladen, was ein manuelles Fixieren und mehr Verarbeitungsleistung erfordert:

var loader:Loader = new Loader(); 
 
loader.load ( new URLRequest ( "content.swf" ) ); 
 
addChild ( loader ); 
 
stage.addEventListener ( MouseEvent.CLICK, unloadSWF ); 
 
function unloadSWF ( e:MouseEvent ):void 
{ 
    // Unload the SWF file with no automatic object deactivation 
    // All deactivation must be processed manually 
    loader.unload(); 
}

Es empfiehlt sich, die unloadAndStop() -Methode zu verwenden, die das Fixieren nativ durchführt und die Ausführung der Speicherbereinigung erzwingt:

var loader:Loader = new Loader(); 
 
loader.load ( new URLRequest ( "content.swf" ) ); 
 
addChild ( loader ); 
 
stage.addEventListener ( MouseEvent.CLICK, unloadSWF ); 
 
function unloadSWF ( e:MouseEvent ):void 
{ 
    // Unload the SWF file with automatic object deactivation 
    // All deactivation is handled automatically 
    loader.unloadAndStop(); 
}

Die folgenden Aktionen werden beim Aufruf der unloadAndStop() -Methode ausgeführt:

  • Sounds werden gestoppt.

  • Listener, die für die Hauptzeitleiste der SWF-Datei registriert sind, werden entfernt.

  • Timer-Objekte werden gestoppt.

  • Peripheriegeräte (wie Kamera und Mikrofon) werden freigegeben.

  • Jeder Movieclip wird gestoppt.

  • Das Auslösen von Event.ENTER_FRAME , Event.FRAME_CONSTRUCTED , Event.EXIT_FRAME , Event.ACTIVATE und Event.DEACTIVATE wird gestoppt.

Aktivieren und Deaktivieren von Ereignissen

Mit Event.ACTIVATE - und Event.DEACTIVATE -Ereignissen können Sie Hintergrundinaktivität erkennen und Ihre Anwendung entsprechend optimieren.

Zwei Ereignisse ( Event.ACTIVATE und Event.DEACTIVATE ) sind bei der Feinabstimmung der Anwendung hilfreich, damit so wenig CPU-Durchläufe wie möglich verwendet werden. Mit diesen Ereignissen können Sie erkennen, wenn die Laufzeitumgebung den Fokus erhält oder verliert. So kann der Code optimiert werden, um auf Kontextänderungen zu reagieren. Im folgenden Code werden Listener für beide Ereignisse verwendet und die Bildrate wird auf null gesetzt, wenn die Anwendung den Fokus verliert. Die Anwendung kann zum Beispiel den Fokus verlieren, wenn der Benutzer auf einen anderen Tab wechselt oder die Anwendung in den Hintergrund verschiebt:

var originalFrameRate:uint = stage.frameRate; 
var standbyFrameRate:uint = 0; 
  
stage.addEventListener ( Event.ACTIVATE, onActivate ); 
stage.addEventListener ( Event.DEACTIVATE, onDeactivate ); 
  
function onActivate ( e:Event ):void 
{ 
    // restore original frame rate 
    stage.frameRate = originalFrameRate; 
} 
  
function onDeactivate ( e:Event ):void 
{ 
    // set frame rate to 0 
    stage.frameRate = standbyFrameRate; 
}

Wenn die Anwendung wieder den Fokus erhält, wird die Bildrate auf den ursprünglichen Wert zurückgesetzt. Anstatt die Bildrate dynamisch zu ändern, können Sie auch andere Optimierungen in Betracht ziehen, zum Beispiel das Fixieren von Objekten bzw. das Aufheben der Fixierung.

Das Aktivieren und Deaktivieren von Ereignissen ermöglicht Ihnen, einen ähnlichen Mechanismus wie die Funktion „Anhalten und Fortsetzen“, die auf bestimmten mobilen Geräten und Netbooks zu finden ist, zu verwenden.

Mausinteraktionen

Es empfiehlt sich, Mausinteraktionen nach Möglichkeit zu deaktivieren.

Wenn Sie ein interaktives Objekt, zum Beispiel ein MovieClip- oder Sprite-Objekt, verwenden, führt die Laufzeitumgebung nativen Code aus, um Mausinteraktionen zu erkennen und zu verarbeiten. Das Erkennen von Mausinteraktionen kann die CPU stark beanspruchen, wenn zahlreiche interaktive Objekte auf dem Bildschirm angezeigt werden, besonders wenn diese Objekte sich überlappen. Dieser Verarbeitungsaufwand lässt sich auf einfache Weise vermeiden, indem die Mausinteraktionen für Objekte deaktiviert werden, die keine Mausinteraktion erfordern. Der folgende Code veranschaulicht die Verwendung der Eigenschaften mouseEnabled und mouseChildren :

// Disable any mouse interaction with this InteractiveObject 
myInteractiveObject.mouseEnabled = false; 
const MAX_NUM:int = 10; 
  
// Create a container for the InteractiveObjects 
var container:Sprite = new Sprite(); 
  
for ( var i:int = 0; i< MAX_NUM; i++ ) 
{ 
    // Add InteractiveObject to the container 
    container.addChild( new Sprite() ); 
} 
  
// Disable any mouse interaction on all the children 
container.mouseChildren = false;

Nach Möglichkeit sollten Sie Mausinteraktionen deaktivieren, da die Anwendung so weniger CPU-Ressourcen erfordert und die Akkulaufzeit von mobilen Geräten sich verlängert.

Timer und ENTER_FRAME-Ereignisse im Vergleich

Wählen Sie entweder Timer oder ENTER_FRAME -Ereignisse, je nachdem, ob der Inhalt animiert ist oder nicht.

Bei nicht animiertem Inhalt, der über einen langen Zeitraum ausgeführt wird, sind Timer den Event.ENTER_FRAME -Ereignissen vorzuziehen.

In ActionScript 3.0 gibt es zwei Möglichkeiten, um eine Funktion in bestimmten Intervallen aufzurufen. Die erste Technik ist die Verwendung des Event.ENTER_FRAME -Ereignisses, das von Anzeigeobjekten ausgelöst wird (DisplayObject). Beim zweiten Verfahren wird ein Timer verwendet. ActionScript-Entwickler verwenden häufig das ENTER_FRAME -Ereignis. Das ENTER_FRAME -Ereignis wird für jedes Bild ausgelöst. Deshalb bezieht sich das Intervall, in dem die Funktion aufgerufen wird, auf die aktuelle Bildrate. Die Bildrate kann über die Stage.frameRate -Eigenschaft bestimmt werden. Manchmal ist ein Timer jedoch dem ENTER_FRAME -Ereignis vorzuziehen. Wenn Sie beispielsweise keine Animation verwenden, der Code aber in bestimmten Intervallen aufgerufen werden soll, ist ein Timer möglicherweise die bessere Wahl.

Ein Timer kann sich ähnlich wie ein ENTER_FRAME -Ereignis verhalten, doch ein Ereignis kann ausgelöst werden, ohne dass es an die Bildrate gebunden ist. Über dieses Verhalten lassen sich in manchen Fällen deutliche Optimierungsvorteile erzielen. Nehmen wir als Beispiel eine Videoplayer-Anwendung. In diesem Fall wird keine hohe Bildrate benötigt, da nur die Anwendungssteuerungen sich bewegen.

Hinweis: Die Bildrate wirkt sich nicht auf das Video aus, da das Video nicht in der Zeitleiste eingebettet ist. Stattdessen wird das Video dynamisch über den progressiven Download oder per Streaming geladen.

In diesem Beispiel ist die Bildrate mit 10 fps auf einen niedrigen Wert eingestellt. Der Timer aktualisiert die Steuerungen mit einer Rate von einer Aktualisierung pro Sekunde. Die höhere Aktualisierungsrate wird durch die updateAfterEvent() -Methode ermöglicht, die für das TimerEvent-Objekt zur Verfügung steht. Diese Methode erzwingt immer dann eine Bildschirmaktualisierung, wenn der Timer ein Ereignis auslöst (sofern erforderlich). Dieses Konzept wird im folgenden Code veranschaulicht:

// Use a low frame rate for the application 
stage.frameRate = 10; 
  
// Choose one update per second 
var updateInterval:int = 1000; 
var myTimer:Timer = new Timer(updateInterval,0); 
  
myTimer.start(); 
myTimer.addEventListener( TimerEvent.TIMER, updateControls ); 
  
function updateControls( e:TimerEvent ):void 
{ 
    // Update controls here 
    // Force the controls to be updated on screen 
    e.updateAfterEvent(); 
}

Durch Aufruf der updateAfterEvent() -Methode ändert sich die Bildrate nicht. Die Methode zwingt die Laufzeitumgebung nur, den Inhalt auf dem Bildschirm zu aktualisieren, der sich geändert hat. Die Zeitleiste läuft immer noch mit einer Bildrate von 10 fps. Beachten Sie, dass Timer und ENTER_FRAME -Ereignisse auf Geräten mit niedriger Leistung nicht hundertprozentig genau sind, und auch dann nicht, wenn Ereignisprozedurfunktionen verarbeitungsintensiven Code enthalten. Genau wie die Bildrate der SWF-Datei kann auch die Aktualisierungsbildrate des Timers in manchen Situationen variieren.

Halten Sie die Anzahl der Timer-Objekte und registrierten enterFrame -Prozeduren in Ihrer Anwendung gering.

In jedem Bild setzt die Laufzeitumgebung ein enterFrame -Ereignis an alle Anzeigeobjekte in ihrer Anzeigeliste ab. Sie können zwar Listener für das enterFrame -Ereignis mit mehreren Anzeigeobjekten registrieren, dies bedeutet jedoch, dass in jedem Bild mehr Code ausgeführt wird. Überlegen Sie stattdessen, eine einzelne zentrale enterFrame -Prozedur zu verwenden, die den gesamten Code ausführt, der in jedem Bild ausgeführt werden soll. Dadurch kann häufig ausgeführter Code einfacher verwaltet werden.

Auf ähnliche Weise entsteht beim Verwenden von Timer-Objekten eine höhere Verarbeitungslast durch das Erstellen und Absetzen von Ereignissen aus mehreren Timer-Objekten. Wenn unterschiedliche Operationen in verschiedenen Intervallen ausgelöst werden müssen, kommen folgende Alternativen infrage:

  • Verwenden Sie möglichst wenige Timer-Objekte und gruppieren Sie Operationen nach der Häufigkeit ihres Auftretens..

    Verwenden Sie zum Beispiel einen Timer für häufige Operationen, der alle 100 Millisekunden ausgelöst wird. Verwenden Sie einen anderen Timer für weniger häufige oder Hintergrundoperationen, der alle 2000 Millisekunden ausgelöst wird.

  • Verwenden Sie ein einzelnes Timer-Objekt und lassen Sie Operationen zu Vielfachen der delay -Eigenschaft des Timer-Objekts auslösen.

    Zum Beispiel könnten Sie einige Operationen haben, die alle 100 Millisekunden ausgeführt werden sollen, und anderen, die alle 200 Millisekunden ausgeführt werden sollen. Verwenden Sie in diesem Fall ein einzelnes Timer-Objekt mit einem delay -Wert von 100 Millisekunden. Fügen Sie in der timer -Ereignisprozedur eine bedingte Anweisung hinzu, die die 200-Millisekunden-Operation nur jedes zweite Mal ausführt. Diese Vorgehensweise wird im folgenden Beispiel veranschaulicht:

    var timer:Timer = new Timer(100); 
    timer.addEventListener(TimerEvent.Timer, timerHandler); 
    timer.start(); 
         
    var offCycle:Boolean = true; 
      
    function timerHandler(event:TimerEvent):void 
    { 
        // Do things that happen every 100 ms 
         
        if (!offCycle) 
        { 
            // Do things that happen every 200 ms 
        } 
         
        offCycle = !offCycle; 
    }
Beenden Sie Timer-Objekte, die nicht verwendet werden.

Wenn die timer -Ereignisprozedur eines Timer-Objekts Operationen nur unter bestimmten Bedingungen ausführt, rufen Sie die stop() -Methode des Timer-Objekts auf, wenn keine der Bedingungen erfüllt ist.

Minimieren Sie in enterFrame -Ereignisprozeduren oder Timer-Prozeduren die Anzahl der Änderungen am Erscheinungsbild von Anzeigeobjekten, die zum Neuzeichnen des Bildschirms führen.

In jedem Bild zeichnet die Renderphase den Teil der Bühne neu, der in diesem Bild geändert wurde. Wenn der neu zu zeichnende Bereich groß ist oder zwar klein ist, aber zahlreiche oder komplexe Anzeigeobjekte enthält, braucht die Laufzeitumgebung mehr Zeit für das Rendering. Um zu testen, wie viel neu gezeichnet werden muss, verwenden Sie die Funktion „Bildaktualisierungsbereiche anzeigen“ in der Debugversion von Flash Player oder AIR.

Weitere Informationen zum Verbessern der Leistung bei wiederholten Aktionen finden Sie im folgenden Artikel:

Tweening-Syndrom

Setzen Sie das Tweening nur spärlich ein, um CPU-Ressourcen und Arbeitsspeicher einzusparen und die Akkulaufzeit zu verlängern.

Designer und Entwickler von Inhalt für Flash auf dem Desktop statten ihre Anwendungen häufig mit zahlreichen Bewegungs-Tweens aus. Bei der Erstellung von Inhalt für Mobilgeräte mit niedriger Leistung sollten Sie so weit wie möglich auf Bewegungs-Tweens verzichten. Dadurch kann Inhalt auf Geräten der unteren Leistungsklasse schneller ausgeführt werden.