on(EnterFrame) zwingt alles in die Knie

Coldfist

Mitglied
Hallo!
Ich bin im Moment fleißig am duplicaten und habe mir jetzt einen Bildschirmschoner gebaut (soll mal einer werden), in dem Regentropfen auf dem Bildschirm runter, aber auch hoch laufen. Funktion:
PHP:
MovieClip.prototype.regen = function() {
	i = 0;
	this.onEnterFrame = function() {
		i++;
		if (i == 1000) {
			i = 1;
		}
		newRaino = rain.duplicateMovieClip("raino"+i, i);
		newRaino._y = -10;
		newRaino._x = Math.random()*1024;
		newRaino.fallspeed = Math.random()*8+3;
		newRaino.onEnterFrame = function() {
			if (this._y>768) {
				this.removeMovieClip();
			} else {
				this._width = this.fallspeed/5;
				this._y += this.fallspeed;
			}
		};
		'nächste';
		newRainu = rain.duplicateMovieClip("rainu"+i, i+1000);
		newRainu._y = 778;
		newRainu._x = Math.random()*1024;
		newRainu.fallspeed = Math.random()*8+3;
		newRainu.onEnterFrame = function() {
			if (this._y<-10) {
				this.removeMovieClip();
			} else {
				this._width = this.fallspeed/5;
				this._y -= this.fallspeed;
			}
		};
	};
};
_root.rain.regen();

Das ganze bringt selbst meinen fixen Rechner leicht zum ruckeln.
Gibt es da etwas kompakteres, leichteres womit jeder Rechner klar kommt?

mfg
Cold
 
Hi,

na ja, bei dieser Methode habe ich in etwa 250 Instanzen gleichzeitig auf der Bühne, was mit einem recht kleinen "rain"-Clip ziemlich flüssig läuft (ca. 13% Auslastung).

Ich könnte Dir höchstens empfehlen, gleich zu Anfang eine feste Anzahl Duplikate zu instanzieren (z.B. 100 Stück) und diese beim Erreichen der Bildschirmgrenze einfach neu zu positionieren.

... oder Du prüfst laufend (mit getTimer() ) die aktuelle Framerate und löschst ggf. zwischendurch die eine oder andere Instanz ;)

Natürlich hängt der Ressourcenverbrauch auch von der Komplexität des Clips "rain" ab; ich habe zum Testen einfach einen schwarzen Kreis mit 5 Pixel Durchmesser verwendet, aber wenn Du etwas animiertes, 200 Pixel großes mit vielen Ebenen und weiteren onEnterFrames als Regentropfen hast, ist klar, dass Du die Anzahl Tropfen reduzieren musst.

Gruß
.
 
Hi!
Also der Rain Clip ist wirklich nur eine kleine Eklipse mit radialer Füllung.
Wie kannst du denn die Fps messen? Hast du dafür ein Programm oder gibts da ein Flash-Command?

Da ich weder die Regentropfen limitieren will, noch welche mittendrin rauslöschen bleibt mir wohl nichts anderes übrig als zu glauben, das dingen würde nicht ganz flüssig laufen :)
Danke!

mfg
Cold
 
Hi,

na ja, die fps kannst Du in einer onEnterFrame-Methode in etwa folgendermaßen messen:

-> am Anfang des Films mit getTimer() die Milisekunden speichern
-> eine Zählvariable für die Frames auf 0 setzen

-> in der onEnterFrame die vergangenen Milisekunden mit (getTimer() - startzeit) messen
-> und dort auch die Zählvariable jeden Frameaufruf um 1 erhöhen

Somit kennst Du die vergangenen Milisekunden seit Filmstart und die bisher angezeigten Frames und kannst in etwa dir durchschnittliche Framerate berechnen.

Eine einfachere Methode wäre, jeden Frameaufruf getTimer() zu speichern und mit dem letzten gespeicherten Wert zu vergleichen; dann hättest Du jeweils die Zeit in ms, die der letzte Frameaufruf gedauert hat. Sehr genau ist das nicht, aber damit könntest Du z.B: prüfen, ob die Framerate unter 16 fällt... ;)

Gruß
.
 
Hi,
schöne Sache erstmal.
Beim flüchtigen Durchlesen ist mir die Zeile aufgefallen:
PHP:
newRaino._x = Math.random()*1024;
Ohne Rundung werden der x-Koordinate Zahlen wie 234,2342352356
übergeben. Ich weiss nicht mit was Flash mehr Performanceeinschränkungen hat, wenn man noch ein math.round davorsetzt oder wenn man es so lässt.
Vielleicht ist dir das gar nicht aufgefallen, oder war ein bestimmter Sinn dahinter?
 
Das stimmt wohl, daran habe ich wirklich nicht gedacht.
Aber kann eine x-Koordinate nicht sowieso nur eine Nachkommastelle haben?

Das würde doch heißen, dass Flash automatisch rundet.

mfg
Cold
 
Hi,

ja, das denke ich auch. Da Werte, die kleiner als ein Pixel sind, durchaus als Positions- und Skalierungsangaben zulässig sind, wird Flash sowieso auf gültige Genauigkeiten runden. Du kannst natürlich mal ausprobieren, ob sich an der Performance etwas ändert, wenn Du alle Werte auf Integer (oder z.B. nur 4 Nachkommestellen) rundest, aber ich bezweifle es. Zumal: Ob Du nun rundest, oder Flash dürfte gehupft wie gesprungen sein.

Gruß
.
 
Zurück