7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. ActionScript

ActionScript 3.0-Optimierung: Ein praktisches Beispiel

Read Time: 26 mins

German (Deutsch) translation by Katharina Grigorovich-Nevolina (you can also view the original English article)

Die Codeoptimierung zielt darauf ab, die Leistung Ihrer Flash-Assets zu maximieren und dabei so wenig Ressourcen wie möglich - RAM und CPU - des Systems zu verbrauchen. In diesem Tutorial werden wir, beginnend mit einer funktionierenden, aber ressourcenintensiven Flash-App, nach und nach viele Optimierungsänderungen am Quellcode vornehmen und schließlich eine schnellere, schlankere SWF erhalten.


Endergebnis Vorschau

Werfen wir einen Blick auf das Endergebnis, auf das wir hinarbeiten werden:

Beachten Sie, dass die Statistiken "Speicherbedarf" und "CPU-Auslastung" auf allen SWFs basieren, die Sie in allen Browserfenstern geöffnet haben, einschließlich Flash-Bannerwerbung und dergleichen. Dies kann dazu führen, dass die SWF ressourcenintensiver erscheint als sie tatsächlich ist.


Schritt 1: Grundlegendes zum Flash-Film

Der Flash-Film besteht aus zwei Hauptelementen: einer Partikelsimulation des Feuers und einer Grafik, die den Ressourcenverbrauch der Animation über die Zeit zeigt. Die rosa Linie des Diagramms zeigt den gesamten vom Film verbrauchten Speicher in Megabyte an, und die grüne Linie zeigt die CPU-Auslastung in Prozent.

ActionScript-Objekte belegen den größten Teil des dem Flash Player zugewiesenen Speichers. Je mehr ActionScript-Objekte ein Film enthält, desto höher ist der Speicherverbrauch. Um den Speicherverbrauch eines Programms gering zu halten, führt der Flash Player regelmäßig eine Speicherbereinigung durch, indem er alle ActionScript-Objekte durchsucht und die nicht mehr verwendeten Objekte aus dem Speicher freigibt.

Ein Speicherverbrauchsdiagramm zeigt normalerweise ein hügeliges Auf-Ab-Muster, das bei jeder Speicherbereinigung eintaucht und dann langsam ansteigt, wenn neue Objekte erstellt werden. Eine Grafiklinie, die nur nach oben zeigt, weist auf ein Problem mit der Speicherbereinigung hin, da neue Objekte zum Speicher hinzugefügt werden, während keine entfernt werden. Wenn sich ein solcher Trend fortsetzt, stürzt der Flash Player möglicherweise ab, da ihm der Speicher ausgeht.

Die CPU-Belastung wird berechnet, indem die Framerate des Films verfolgt wird. Die Framerate eines Flash-Films ist so etwas wie sein Herzschlag. Mit jedem Schlag aktualisiert und rendert der Flash Player alle Bildschirmelemente und führt auch alle erforderlichen ActionScript-Aufgaben aus.

Die Bildrate bestimmt, wie viel Zeit Flash Player für jeden Schlag aufwenden soll. Eine Bildrate von 10 Bildern pro Sekunde (fps) bedeutet also mindestens 100 Millisekunden pro Schlag. Wenn alle erforderlichen Aufgaben innerhalb dieser Zeit ausgeführt wurden, wartet der Flash Player, bis die verbleibende Zeit verstrichen ist, bevor er mit dem nächsten Takt fortfährt. Wenn andererseits die erforderlichen Aufgaben in einem bestimmten Takt zu CPU-intensiv sind, um innerhalb des vorgegebenen Zeitrahmens ausgeführt zu werden, verlangsamt sich die Bildrate automatisch, um zusätzliche Zeit zu ermöglichen. Sobald die Last leichter wird, beschleunigt sich die Bildrate wieder auf die eingestellte Rate.

(Die Bildrate kann vom Flash Player auch automatisch auf 4 fps gedrosselt werden, wenn das übergeordnete Fenster des Programms den Fokus verliert oder vom Bildschirm abweicht. Dies dient dazu, Systemressourcen zu schonen, wenn die Aufmerksamkeit des Benutzers auf andere Bereiche gerichtet wird.)

Das bedeutet, dass es eigentlich zwei Arten von Frameraten gibt: die, die Sie ursprünglich eingestellt haben und von der Sie hoffen, dass Ihr Film immer mit ihr läuft, und die, mit der er tatsächlich läuft. Die von Ihnen eingestellte Rate nennen wir die Soll-Framerate, die tatsächlich laufende Rate die Ist-Framerate.

Die CPU-Auslastung des Diagramms wird als Verhältnis der tatsächlichen zur Zielbildrate berechnet. Die Formel, mit der dies berechnet wird, lautet:

CPU load = ( target frame rate - actual frame rate ) / actual frame rate * 100

Wenn beispielsweise die Zielbildrate auf 50 fps eingestellt ist, der Film jedoch tatsächlich mit 25 fps ausgeführt wird, beträgt die CPU-Auslastung 50%, d.h. (50 - 25)/ 50 * 100.

Bitte beachten Sie, dass dies nicht der tatsächliche Prozentsatz der vom laufenden Film verwendeten System-CPU-Ressourcen ist, sondern eine grobe Schätzung des tatsächlichen Werts. Für den hier beschriebenen Optimierungsprozess ist diese Schätzung eine ausreichend gute Metrik für die jeweilige Aufgabe. Verwenden Sie die von Ihrem Betriebssystem bereitgestellten Tools, z. der Task-Manager in Windows. Wenn ich mir das jetzt ansehe, zeigt es, dass der nicht optimierte Film 53% der CPU-Ressourcen verbraucht, während das Diagramm des Films eine CPU-Auslastung von 41,7% zeigt.

a screenshot of Flames.swf after all the steps above have been applied.a screenshot of Flames.swf after all the steps above have been applied.a screenshot of Flames.swf after all the steps above have been applied.

BITTE BEACHTEN SIE: Alle Film-Screenshots in diesem Tutorial stammen aus der Standalone-Version von Flash Player. Das Diagramm zeigt höchstwahrscheinlich unterschiedliche Zahlen auf Ihrem System, abhängig von Ihrem Betriebssystem, Browser und der Flash Player-Version. Wenn andere Flash-Apps derzeit in anderen Browserfenstern oder Flash-Playern ausgeführt werden, kann sich dies auch auf die von einigen Systemen gemeldete Speichernutzung auswirken. Stellen Sie bei der Analyse der Leistung Ihres Programms immer sicher, dass keine anderen Flash-Programme ausgeführt werden, da diese Ihre Metriken beschädigen können.

Erwarten Sie bei einer CPU-Auslastung eine Aufnahme von bis zu über 90%, wenn der Film vom Bildschirm verschwindet - beispielsweise, wenn Sie zu einer anderen Browser-Registerkarte wechseln oder die Seite nach unten scrollen. Die niedrigere Bildrate, die dies verursacht, wird nicht durch CPU-intensive Aufgaben verursacht, sondern durch Flash, das die Bildrate drosselt, wenn Sie woanders hinschauen. Warten Sie in diesem Fall einige Sekunden, bis sich das CPU-Lastdiagramm nach dem Einsetzen der normalen Bildrate auf die richtigen CPU-Lastwerte eingestellt hat.


Schritt 2: Lässt dieser Code mein Flash fett aussehen?

Der Quellcode des Films ist unten dargestellt und enthält nur eine Klasse namens Flames, die auch die Dokumentklasse ist. Die Klasse enthält eine Reihe von Eigenschaften, mit denen der Speicher des Films und der CPU-Ladeverlauf verfolgt werden. Diese werden dann zum Zeichnen eines Diagramms verwendet. Die Speicher- und CPU-Laststatistik wird in der Flames.getStats()-Methode berechnet und aktualisiert, und das Diagramm wird durch Aufrufen von Flames.drawGraph() für jeden Frame gezeichnet. Um den Feuereffekt zu erzeugen, generiert die Flames.createParticles()-Methode zuerst Hunderte von Partikeln pro Sekunde, die im fireParticles-Array gespeichert werden. Dieses Array wird dann von Flames.drawParticles() durchlaufen, das die Eigenschaften jedes Partikels verwendet, um den Effekt zu erzeugen.

Nehmen Sie sich etwas Zeit, um die Flames-Klasse zu lernen. Können Sie bereits schnelle Änderungen erkennen, die einen großen Beitrag zur Optimierung des Programms leisten?

Es gibt viel zu tun, also keine Sorge - wir werden die verschiedenen Verbesserungen im Rest dieses Tutorials durchgehen.


Schritt 3: Verwenden Sie Strong Typing, indem Sie allen Variablen Datentypen zuweisen

Die erste Änderung, die wir an der Klasse vornehmen, besteht darin, den Datentyp aller deklarierten Variablen, Methodenparameter und Methodenrückgabewerte anzugeben.

Ändern Sie dies beispielsweise

dazu.

Geben Sie beim Deklarieren von Variablen immer den Datentyp an, da der Flash-Compiler beim Generieren der SWF-Datei einige zusätzliche Optimierungen vornehmen kann. Dies allein kann zu großen Leistungsverbesserungen führen, wie wir anhand unseres Beispiels bald sehen werden. Ein weiterer zusätzlicher Vorteil einer starken Typisierung besteht darin, dass der Compiler Sie auf alle Datentyp-bezogenen Fehler hinweist.


Schritt 4: Ergebnisse untersuchen

a screenshot of Flames.swf after all the steps above have been applied.a screenshot of Flames.swf after all the steps above have been applied.a screenshot of Flames.swf after all the steps above have been applied.

Dieser Screenshot zeigt den neuen Flash-Film nach starker Eingabe. Wir können sehen, dass der minimale Wert von 8,3% auf 4,2% gesunken ist, obwohl er keinen Einfluss auf die aktuelle oder maximale CPU-Auslastung hatte. Der maximal verbrauchte Speicher ist von 9 MB auf 8,7 MB gesunken.

Die Steigung der Speicherzeile des Diagramms hat sich im Vergleich zu der in Schritt 2 gezeigten ebenfalls geändert. Sie weist immer noch das gleiche gezackte Muster auf, fällt jedoch jetzt langsamer ab und steigt langsamer an. Dies ist eine gute Sache, wenn Sie bedenken, dass der plötzliche Rückgang des Speicherverbrauchs durch die Speicherbereinigung von Flash Player verursacht wird, die normalerweise ausgelöst wird, wenn der zugewiesene Speicher knapp wird. Diese Speicherbereinigung kann eine teure Operation sein, da Flash Player alle Objekte durchsuchen muss, um nach Objekten zu suchen, die nicht mehr benötigt werden, aber dennoch Speicherplatz beanspruchen. Je seltener dies getan werden muss, desto besser.


Schritt 5: Speichern Sie numerische Daten effizient

Actionscript bietet drei numerische Datentypen: Number, uint und int. Von den drei Typen verbraucht Number den meisten Speicher, da größere numerische Werte als die beiden anderen gespeichert werden können. Es ist auch der einzige Typ, der Zahlen mit Dezimalbrüchen speichern kann.

Die Flames-Klasse verfügt über viele numerische Eigenschaften, die alle den Datentyp Number verwenden. Da int und uint kompaktere Datentypen sind, können wir in allen Situationen, in denen wir keine Dezimalbrüche benötigen, Speicherplatz sparen, indem wir sie anstelle von Number verwenden.

Ein gutes Beispiel sind Schleifen und Array-Indizes, also werden wir uns zum Beispiel ändern

in

Die Eigenschaften cpu, cpuMax und memoryMax bleiben Numbers, da sie höchstwahrscheinlich Bruchdaten speichern, während memoryColor, cpuColor und ticks in uints geändert werden können, da sie immer positive ganze Zahlen speichern.


Schritt 6: Methodenaufrufe minimieren

Methodenaufrufe sind teuer, insbesondere das Aufrufen einer Methode aus einer anderen Klasse. Es wird schlimmer, wenn diese Klasse zu einem anderen Paket gehört oder eine statische Methode ist. Das beste Beispiel hierfür ist die Math.floor()-Methode, die in der gesamten Flames-Klasse verwendet wird, um Bruchzahlen abzurunden. Dieser Methodenaufruf kann vermieden werden, indem zum Speichern ganzer Zahlen uints anstelle von Numbers verwendet werden.

Im obigen Beispiel ist der Aufruf von Math.floor() nicht erforderlich, da Flash automatisch jeden einer uint zugewiesenen Bruchzahlwert abrundet.


Schritt 7: Multiplikation ist schneller als Division

In Flash Player ist die Multiplikation anscheinend einfacher als die Division. Daher gehen wir die Flames-Klasse durch und konvertieren jede Divisionsmathematik in die entsprechende Multiplikationsmathematik. Bei der Umrechnungsformel wird der Kehrwert der Zahl auf der rechten Seite der Operation ermittelt und mit der Zahl auf der linken Seite multipliziert. Der Kehrwert einer Zahl wird berechnet, indem 1 durch diese Zahl geteilt wird.

Werfen wir einen kurzen Blick auf die Ergebnisse unserer jüngsten Optimierungsbemühungen. Die CPU-Auslastung hat sich schließlich von 41,7% auf 37,5% verbessert, aber der Speicherverbrauch erzählt eine andere Geschichte. Der maximale Speicher ist auf 9,4 MB gestiegen, den bisher höchsten Stand, und die scharfen Sägezahnkanten des Diagramms zeigen, dass die Speicherbereinigung erneut häufiger ausgeführt wird. Einige Optimierungstechniken haben diesen umgekehrten Effekt auf die Speicher- und CPU-Auslastung und verbessern eine auf Kosten der anderen. Da der Speicherverbrauch fast wieder auf dem ersten Platz liegt, muss noch viel mehr Arbeit geleistet werden.

a screenshot of Flames.swf after all the steps above have been applied.a screenshot of Flames.swf after all the steps above have been applied.a screenshot of Flames.swf after all the steps above have been applied.

Schritt 8: Recycling ist gut für die Umwelt

Auch Sie können Ihren Beitrag zum Umweltschutz leisten. Recyceln Sie Ihre Objekte beim Schreiben Ihres AS3-Codes und reduzieren Sie den Energieverbrauch Ihrer Programme. Sowohl die Schaffung als auch die Zerstörung neuer Objekte sind teure Vorgänge. Wenn Ihr Programm ständig Objekte des gleichen Typs erstellt und zerstört, können große Leistungssteigerungen erzielt werden, indem diese Objekte stattdessen recycelt werden. Wenn wir uns die Flames-Klasse ansehen, können wir sehen, dass jede Sekunde viele Partikelobjekte erstellt und zerstört werden:

Es gibt viele Möglichkeiten, Objekte zu recyceln. In den meisten Fällen wird eine zweite Variable erstellt, um nicht benötigte Objekte zu speichern, anstatt sie zu löschen. Wenn dann ein neues Objekt desselben Typs benötigt wird, wird es aus dem Speicher abgerufen, anstatt ein neues zu erstellen. Neue Objekte werden nur erstellt, wenn der Speicher leer ist. Wir werden etwas Ähnliches mit den Partikelobjekten der Flames-Klasse machen.

Zuerst erstellen wir ein neues Array namens inactiveFireParticles[], in dem Verweise auf Partikel gespeichert werden, deren Lebenseigenschaft Null ist (tote Partikel). In der drawParticles()-Methode wird ein totes Partikel nicht gelöscht, sondern dem inactiveFireParticles[]-Array hinzugefügt.

Als Nächstes ändern wir die Methode createParticles(), um zunächst nach gespeicherten Partikeln im Array inactiveFireParticles[] zu suchen und sie alle zu verwenden, bevor neue Partikel erstellt werden.


Schritt 9: Verwenden Sie nach Möglichkeit Objekt- und Array-Literale

Beim Erstellen neuer Objekte oder Arrays ist die Verwendung der Literal-Syntax schneller als die Verwendung des new Operators.


Schritt 10: Vermeiden Sie die Verwendung dynamischer Klassen

Klassen in ActionScript können entweder versiegelt oder dynamisch sein. Sie sind standardmäßig versiegelt, dh die einzigen Eigenschaften und Methoden, die ein davon abgeleitetes Objekt haben kann, müssen in der Klasse definiert worden sein. Mit dynamischen Klassen können zur Laufzeit neue Eigenschaften und Methoden hinzugefügt werden. Versiegelte Klassen sind effizienter als dynamische Klassen, da einige Leistungsoptimierungen für Flash Player durchgeführt werden können, wenn alle möglichen Funktionen, die eine Klasse jemals haben kann, im Voraus bekannt sind.

Innerhalb der Flames-Klasse erweitern Tausende von Partikeln die integrierte Object-Klasse, die dynamisch ist. Da einem Partikel zur Laufzeit keine neuen Eigenschaften hinzugefügt werden müssen, sparen wir mehr Ressourcen, indem wir eine benutzerdefinierte versiegelte Klasse für die Partikel erstellen.

Hier ist das neue Partikel, das derselben Flames.as-Datei hinzugefügt wurde.

Die Methode createParticles() wird ebenfalls angepasst, wodurch die Zeile geändert wird

zu lesen stattdessen:


Schritt 11: Verwenden Sie Sprites, wenn Sie die Timeline nicht benötigen

MovieClips sind wie die Object-Klasse dynamische Klassen. Die MovieClip-Klasse erbt von der Sprite-Klasse, und der Hauptunterschied zwischen beiden besteht darin, dass MovieClip über eine Zeitleiste verfügt. Da Sprites alle Funktionen von MovieClips abzüglich der Zeitleiste haben, verwenden Sie sie immer dann, wenn Sie ein DisplayObject benötigen, für das die Zeitleiste nicht erforderlich ist. Die Flames-Klasse erweitert den MovieClip, verwendet jedoch nicht die Zeitleiste, da die gesamte Animation über ActionScript gesteuert wird. Die Feuerpartikel werden auf fireMC gezeichnet, einem MovieClip, der seine Zeitachse nicht nutzt.

Wir ändern sowohl Flames als auch fireMC, um stattdessen Sprite zu erweitern, und ersetzen:

mit


Schritt 12: Verwenden Sie Formen anstelle von Sprites, wenn Sie keine untergeordneten Anzeigeobjekte oder Mauseingaben benötigen

Die Shape-Klasse ist noch leichter als die Sprite-Klasse, kann jedoch keine Mausereignisse unterstützen oder untergeordnete Anzeigeobjekte enthalten. Da das fireMC keine dieser Funktionen benötigt, können wir es sicher in eine Form verwandeln.

a screenshot of Flames.swf after all the steps above have been applied.a screenshot of Flames.swf after all the steps above have been applied.a screenshot of Flames.swf after all the steps above have been applied.

Die Grafik zeigt große Verbesserungen beim Speicherverbrauch, der sinkt und bei 4,8 MB stabil bleibt. Die Sägezahnkanten wurden durch eine fast gerade horizontale Linie ersetzt, was bedeutet, dass die Müllabfuhr jetzt selten durchgeführt wird. Die CPU-Auslastung ist jedoch größtenteils wieder auf den ursprünglichen Höchststand von 41,7% zurückgekehrt.


Schritt 13: Vermeiden Sie komplexe Berechnungen innerhalb von Schleifen

Sie sagen, dass mehr als 50% der Zeit eines Programms damit verbracht wird, 10% seines Codes auszuführen, und dass der größte Teil dieser 10% höchstwahrscheinlich von Schleifen belegt wird. Bei vielen Schleifenoptimierungstechniken werden möglichst viele CPU-intensive Operationen außerhalb des Körpers einer Schleife platziert. Diese Vorgänge umfassen Objekterstellung, Variablensuche und Berechnungen.

Die erste Schleife in der drawGraph()-Methode ist oben dargestellt. Die Schleife durchläuft jedes Element des memoryLog-Arrays und verwendet jeden Wert, um Punkte im Diagramm zu zeichnen. Zu Beginn jedes Laufs wird die Länge des memoryLog-Arrays nachgeschlagen und mit dem Schleifenzähler verglichen. Wenn das memoryLog-Array 200 Elemente enthält, wird die Schleife 200 Mal ausgeführt und führt dieselbe Suche 200 Mal durch. Da sich die Länge von memoryLog nicht ändert, sind die wiederholten Suchvorgänge verschwenderisch und unnötig. Es ist besser, den Wert von memoryLog.length nur einmal vor Beginn der Suche nachzuschlagen und in einer lokalen Variablen zu speichern, da der Zugriff auf eine lokale Variable schneller ist als der Zugriff auf die Eigenschaft eines Objekts.

In der Flames-Klasse passen wir die beiden Schleifen in der drawGraph()-Methode wie oben gezeigt an.


Schritt 14: Platzieren Sie bedingte Aussagen, die am wahrscheinlichsten wahr sind

Betrachten Sie den folgenden Block von if..else-Bedingungen, der von der drawParticles()-Methode abgeleitet wurde:

Der Lebenswert eines Partikels kann eine beliebige Zahl zwischen 0 und 100 sein. Die if-Klausel prüft, ob die Lebensdauer des aktuellen Partikels zwischen 91 und 100 liegt, und führt in diesem Fall den Code innerhalb dieses Blocks aus. Die else-if-Klausel prüft auf einen Wert zwischen 46 und 90, während die else-Klausel die verbleibenden Werte zwischen 0 und 45 verwendet. Wenn man bedenkt, dass die erste Prüfung auch am wenigsten erfolgreich ist, da sie den kleinsten Zahlenbereich aufweist, sollte dies die letzte getestete Bedingung sein. Der Block wird wie unten gezeigt neu geschrieben, sodass die wahrscheinlichsten Bedingungen zuerst bewertet werden, wodurch die Bewertungen effizienter werden.


Schritt 15: Fügen Sie Elemente am Ende eines Arrays hinzu, ohne sie zu verschieben

Die Methode Array.push() wird in der Flames-Klasse häufig verwendet. Es wird durch eine schnellere Technik ersetzt, die die length-Eigenschaft des Arrays verwendet.

Wenn wir die Länge des Arrays kennen, können wir Array.push() durch eine noch schnellere Technik ersetzen, wie unten gezeigt.


Schritt 16: Ersetzen Sie Arrays durch Vektoren

Die Array- und Vektorklassen sind bis auf zwei Hauptunterschiede sehr ähnlich: Vektoren können nur Objekte desselben Typs speichern und sind effizienter und schneller als Arrays. Da alle Arrays in der Flames-Klasse je nach Bedarf Variablen nur eines Typs speichern - Ints, Uint oder Particles - werden wir sie alle in Vektoren konvertieren.

Diese Arrays:

... werden durch ihre Vektoräquivalente ersetzt:

Dann ändern wir die Methode getColorRange() so, dass sie eher mit Vektoren als mit Arrays arbeitet.


Schritt 17: Verwenden Sie das Ereignismodell sparsam

Das AS3-Ereignismodell ist zwar sehr praktisch und praktisch, basiert jedoch auf einem ausgeklügelten Aufbau von Ereignis-Listenern, Dispatchern und Objekten. dann gibt es Ereignisausbreitung und Blasenbildung und vieles mehr, über die ein Buch geschrieben werden kann. Rufen Sie nach Möglichkeit immer eine Methode direkt und nicht über das Ereignismodell auf.

Die Flames-Klasse verfügt über drei Ereignis-Listener, die drei verschiedene Methoden aufrufen und alle an das ENTER_FRAME-Ereignis gebunden sind. In diesem Fall können wir den ersten Ereignis-Listener behalten und die beiden anderen entfernen. Anschließend kann die drawParticles()-Methode getStats() aufrufen, die wiederum drawGraph() aufruft. Alternativ können wir einfach eine neue Methode erstellen, die getStats(), drawGraph() und drawParticles() direkt für uns aufruft, und dann nur einen Ereignis-Listener haben, der an die neue Methode gebunden ist. Die zweite Option ist jedoch teurer, daher bleiben wir bei der ersten.

Wir entfernen auch den Ereignisparameter (der das Event-Objekt enthält) sowohl aus drawGraph() als auch aus getStats(), da sie nicht mehr benötigt werden.


Schritt 18: Deaktivieren Sie alle Mausereignisse für Anzeigeobjekte, die sie nicht benötigen

Da für diese Flash-Animation keine Benutzerinteraktion erforderlich ist, können wir das Anzeigeobjekt vom Auslösen unnötiger Mausereignisse befreien. In der Flames-Klasse setzen wir dazu die mouseEnabled-Eigenschaft auf false. Das Gleiche tun wir auch für alle untergeordneten Elemente, indem wir die mouseChildren-Eigenschaft auf false setzen. Die folgenden Zeilen werden dem Flames-Konstruktor hinzugefügt:


Schritt 19: Verwenden Sie die Graphics.drawPath()-Methode, um komplexe Formen zu zeichnen

Graphics.drawPath() ist für die Leistung beim Zeichnen komplexer Pfade mit vielen Linien oder Kurven optimiert. Bei der Flames.drawGraph()-Methode werden die Grafiklinien für CPU-Auslastung und Speicherverbrauch mithilfe einer Kombination aus Graphics.moveTo()- und Graphics.lineTo()-Methoden gezeichnet.

Wir ersetzen die ursprünglichen Zeichenmethoden durch Aufrufe von Graphics.drawPath(). Ein zusätzlicher Vorteil des überarbeiteten Codes unten ist, dass wir auch die Zeichenbefehle aus den Schleifen entfernen können.


Schritt 20: Machen Sie die Klassen endgültig

Das final Attribut gibt an, dass eine Methode nicht überschrieben oder eine Klasse nicht erweitert werden kann. Es kann auch dazu führen, dass eine Klasse schneller ausgeführt wird, sodass sowohl die Flames- als auch die Particle-Klasse endgültig sind.

Bearbeiten: Leser Moko hat uns auf diesen großartigen Artikel von Jackson Dunstan hingewiesen, in dem darauf hingewiesen wird, dass das final Schlüsselwort keinen Einfluss auf die Leistung hat.

a screenshot of Flames.swf after all the steps above have been applied.a screenshot of Flames.swf after all the steps above have been applied.a screenshot of Flames.swf after all the steps above have been applied.

Die CPU-Auslastung beträgt jetzt 33,3%, während der insgesamt verwendete Speicher zwischen 4,8 und 5 MB bleibt. Wir haben einen langen Weg von der CPU-Auslastung von 41,7% und der maximalen Speichergröße von 9 MB zurückgelegt!

Das bringt uns zu einer der wichtigsten Entscheidungen, die in einem Optimierungsprozess getroffen werden müssen: zu wissen, wann wir aufhören müssen. Wenn Sie zu früh aufhören, kann Ihr Spiel oder Ihre Anwendung auf Low-End-Systemen eine schlechte Leistung erbringen. Wenn Sie zu weit gehen, wird Ihr Code möglicherweise verschleierter und schwieriger zu warten. Mit dieser speziellen Anwendung sieht die Animation flüssig und flüssig aus, während die CPU- und Speichernutzung unter Kontrolle ist. Wir werden hier also aufhören.


Zusammenfassung

Wir haben uns gerade den Optimierungsprozess am Beispiel der Flames-Klasse angesehen. Während die vielen Optimierungstipps Schritt für Schritt präsentiert wurden, spielt die Reihenfolge keine Rolle. Wichtig ist, sich der vielen Probleme bewusst zu sein, die unser Programm verlangsamen können, und Maßnahmen zu ihrer Behebung zu ergreifen.

Denken Sie jedoch daran, auf vorzeitige Optimierung zu achten. Konzentrieren Sie sich zuerst darauf, Ihr Programm zu erstellen und zum Laufen zu bringen, und optimieren Sie dann die Leistung.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Scroll to top
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.