Antworten auf deine Fragen:
Neues Thema erstellen

Antworten zum Thema „Willkommens Intro, wer kann helfen?!“

h_seldon

Aktives Mitglied

Post 2: Optimierung und Anmerkung re Syntax

Natürlich kann man das Skript noch optimieren. Ohne die Vorgehensweise grundlegend zu ändern, erhält man dann etwa 494 Byte.
Es ergibt sich z.B. folgendes Skript (bitte ohne die Zeilennummerierung eintragen):

1 for (var i = 1; i<=50; i++) {
2 this.attachMovie("m", "k"+i, i, {_y:700});
3 }
4 this.onEnterFrame = function() {
5 for (e in this) {
6 w = this[e];
7 w._x += w.aw-2;
8 w._y += w.t;
9 if (w._y>600) {
10 w.aw = Math.random();
11 w.width = w._height=2;
12 w._x = Math.ceil(Math.random()*800);
13 w._y = -50;
14 w.sc = Math.random()*30;
15 w._xscale *= w.sc;
16 w._yscale *= w.sc;
17 w._alpha = 100-(w.sc*2);
18 w.t = Math.ceil(Math.random()*12)+3;
19 }
20 }
21 };

Flash ist ein Programm, das über viel versteckten Humor verfügt ? und so kann man die Dateigröße reduzieren, indem man die Namen von Variablen, Funktionen etc. gnadenlos verstümmelt, also kürzt. Aus dem Variablennamen abweichung wurde hier z.B. ein angenehm kurzes aw (OK, a hätte auch gereicht). Ähnlich wurden alle anderen Namen, soweit möglich, eingedampft. Selbst das this[e] spart einige Bytes, wenn man es in eine Variable ? in unserem Beispiel: w ? hinein stopft.
Auch die Anzahl der Skriptzeilen schlagen verständlicherweise negativ zu Buche. Deswegen wurde kräftig entrümpelt, wobei ich mir gewisse Schlampereien von Flash zunutze machte, z.B.: die Flocken werden nicht mehr, wie es unter dem Gesichtspunkt der Datenverwaltung angemessen wäre, in einen eigenen Container gepackt, sondern einfach auf die Bühne geschmissen. Wenn im enterFrame-Ereignis darauf zugegriffen wird, verzichte ich auf eine Abfrage, ob denn das Objekt, das in der for in-Schleife angesprochen wird, auch wirklich einen MovieClip darstellt. Das ist insofern wichtig, als die Schleife jedes Objekt auswählt, also z.B. auch die Versionsnummer des Flash-Players, die ein eigenes Objekt auf _root darstellt. Das kann man testen, indem man in einem leeren MovieClip in den ersten Frame folgendes Bildskript einträgt:
for(e in this){
trace(this[e]);
}
Dann wird z.B. folgendes ausgegeben:
WIN 7,0,19,0
Befindet sich bereits eine Funktionsdefinition in der Zeitleiste, erhält man zusätzlich ein [type Function] etc. Zurück zur for in-Schleife im zweiten Codebeispiel: dort wird also auch beispielsweise all meinen [type Function] eine Bewegungsfunktion zugewiesen. Würde das Programm wie eine höhere Programmiersprache funktionieren, käme eine Fehlermeldung, Flash AS 1.0 dagegen führt geduldig auch diesen Unsinn aus und wir sparen uns einige Zeilen Code.
Variablen, die nicht absolut notwendig sind, wurden gelöscht. So wird beispielsweise die Gesamtzahl der Flocken nicht mehr in einer Variablen definiert, sondern einfach direkt in die Schleife hinein geschrieben. Das ist in einem großen Skript Horror pur, aber hier spart es einige Byte.
Gleichermaßen wurde aus Gründen der Sparsamkeit auf die Funktionsdefiniton von starten() verzichtet. Stattdessen steht nun alles in der for in-Schleife. Damit ergibt sich jedoch ein kleines Problem: wenn beim erstmaligen Einblenden keine Positionierung mehr mit Hilfe von starten() erfolgt, dann bleiben alle Objekte in der linken oberen Ecke hängen. Ein kleiner Trick hilft da weiter: bei attachMovie gebe ich einen weiteren Parameter, genau genommen ein Objekt ? daher die geschweiften Klammern {} ? mit, in dem eine Position größer als die Bühnenhöhe angegeben wird. In dem Fall trifft die if-Bedingung im enterFrame-Ereignis schon direkt beim Einblenden zu und alles bewegt sich wie zuvor, als starten() noch zur Verfügung stand.
Zum Schluß bleiben, wie erwähnt, noch 494 Byte übrig.
Sicher gibt es noch andere Möglichkeiten. Puristen könnten z.B. die bisherige attachMovie-Methode ersetzen durch:
this.attachMovie("m", "k"+i, i, {_y:700, t:(Math.ceil(Math.random()*12)+3), aw:Math.random()});
Wenn man die t und aw betreffenden Zeilen aus dem enterFrame löscht, so gewinnt man noch 2 weitere Byte, kommt also auf 492 Byte. Allerdings hat man dann gegenüber der ursprünglichen Version etwas getrickst, denn sowohl das Tempo wie auch der Modifikator für den Seitenwind werden hier pro Flocke ein einziges Mal am Anfang vergeben und sind danach immer gleich. Unserem Auge fällt das nur deshalb nicht auf, weil wir es mit 50 verschiedenen Flocken zu tun haben, deren Weg wir gar nicht permanent verfolgen können.
Alle hier genannten Optimierungen sind allerdings nur spaßeshalber verwendet worden, um zu zeigen, wie man ohne grundlegende Änderung des Skriptes noch einige Bytes herausholen könnte. In einer professionellen Arbeit sollte man nicht alle hier gemachten Vorschläge umsetzen, da sie das Skript schwer lesbar machen und die Pflege erschweren. Dort bieten sich gegebenenfalls andere Möglichkeiten an.
Interessanterweise wird die Datei um 15 Byte größer, wenn in den Zeilen 1 ? 3 mit duplicateMovieClip anstelle von attachMovie gearbeitet wird (das gilt auch dann, wenn man das Original händisch auf y = 700 ablegt, so daß in der Klammer die Initialisierung von {_y:700} entfallen kann).

Übrigens: Im Gegensatz zu meiner Lösung verwendet TID noch die alte Flash4- bzw. Flash5-Syntax (setProperty, mehrere Frames in der Zeitleiste etc.), die laut Macromedia eigentlich zugunsten der Flash MX-Syntax aufgegeben werden sollte ? diese Feststellung ist nicht abschätzig gemeint, sondern hat einen ganz bestimmten Hintergrund: Da Flash, wie wir ja wissen, Humor besitzt, wird Code in alter Syntax paradoxerweise schneller ausgeführt als die offiziell empfohlene, neuere Syntax!
Dazu ein einfacher Test:
Wir wollen Flash 1000 enterFrames ausführen und dabei eine Variable hochzählen lassen. Anschließend messen wir die vergangene Zeit. Wir arbeiten jeweils mit Bildskripten.
Flash 5-Version:
Bildskript Frame 1:
zahl = 1;
zeit = getTimer();
Bildskript Frame 2:
zeit++;
if(zeit>=1000){
trace(getTimer()-zeit);
this.stop();
}
Bildskript Frame 3:
zeit++;
if(zeit>=1000){
trace(getTimer()-zeit);
this.stop();
}
this.gotoAndPlay(2);
Erläuterung: zunächst definieren wir die Variable zeit zum Hochzählen. Dann merken wir uns die aktuelle Zeit (in Millisekunden), um gegen Ende des Zählens feststellen zu können, wieviel Zeit insgesamt vergangen ist. In Frame 2 und 3 loopen wir (d.h.: wir gehen von 2 zu 3, dann wieder zurück zu 2, dann zu 3 etc.), wobei jedesmal die Variable zeit um 1 inkrementiert und nachgeschaut wird, ob wir bereits bei 1000 angelangt sind. Ist das der Fall, ziehen wir von der jetzt aktuellen Zeit die Startzeit ab und erhalten so die inzwischen vergangene Zeit. Anschließend stopen wir die Zeitleiste.
Flash MX-Version:
anstelle der drei Frames soll man ein enterFrame verwenden, also schreiben wir in den ersten Frame folgendes Bildskript:
zahl = 1;
zeit = getTimer();
this.onEnterFrame = function() {
zahl++;
if (zahl>=1000) {
trace(getTimer()-zeit);
delete this.onEnterFrame;
}
};
Wie zuvor wird eine Variable zum Zählen eingerichtet, die aktuelle Zeit gespeichert und anschließend zum loopen ein enterFrame-Ereignis eingerichtet, das die Aufgabe der Frames 2 und 3 in der vorherigen Variante übernimmt. Haben wir die 1000 erreicht, löschen wir das Ereignis.
Ergebnis: die Flash 5-Version ist im Durchschnitt etwa doppelt so schnell wie die MX-Variante. Da Flash den Loop in einem Frame der Zeitleiste nicht kennt - etwas, was Macromedia in Director schon längst hinbekommen hat -, scheint das enterFrame-Ereignis flashintern als zwei Zeitleistenframes ausgeführt zu werden.
Unterschiede ergeben sich auch z.B. beim Einsatz von Funktionen: wenn wir in jedem Frame die vollständigen Anweisungen eintragen anstatt auf eine irgendwo definierte Funktion zuzugreifen, dann ist Flash schneller, wobei der Unterschied allerdings nicht so signifikant groß ist wie im vorherigen Beispiel. Es gibt noch mehr Späße dieser Art, aber jetzt sind mir schon zwei Finger vom Tippen abgefallen, und ehe der Rest auch noch folgt ?

viel spaß
 
Bilder bitte hier hochladen und danach über das Bild-Icon (Direktlink vorher kopieren) platzieren.
Antworten auf deine Fragen:
Neues Thema erstellen

Willkommen auf PSD-Tutorials.de

In unseren Foren vernetzt du dich mit anderen Personen, um dich rund um die Themen Fotografie, Grafik, Gestaltung, Bildbearbeitung und 3D auszutauschen. Außerdem schalten wir für dich regelmäßig kostenlose Inhalte frei. Liebe Grüße senden dir die PSD-Gründer Stefan und Matthias Petri aus Waren an der Müritz. Hier erfährst du mehr über uns.

Stefan und Matthias Petri von PSD-Tutorials.de

Nächster neuer Gratisinhalt

03
Stunden
:
:
25
Minuten
:
:
19
Sekunden

Neueste Themen & Antworten

Flatrate für Tutorials, Assets, Vorlagen

Zurzeit aktive Besucher

Keine Mitglieder online.

Statistik des Forums

Themen
175.158
Beiträge
2.581.869
Mitglieder
67.224
Neuestes Mitglied
Aliyah79
Oben