Animation läßt RAM-Verbrauch immer weiter steigen

Hallo,

ich erinnere mich an folgende Situationen, wo das Problem auftauchte:

1. Ein (bescheuertes) Werbespiel mit hitTests. Das letzte Mal, wo ich mehr als einen hitTest pro Film gebraucht hab. Dieses Problem konnte ich auch rekonstruieren.

2. Ein riesiges Geschwür von einem Flash-Portal mit (zu vielen) verschiedenen Komponenten, aber das Wichtigste: Jeder Screen wurde animiert auf- und abgebaut, um die Animationen zu timen, hatte ich damals Intervalle benutzt. Die Sache war am Schluss dermassen unübersichtlich, dass ich das ganze neu geschrieben hatte, ich vermute aber, dass ich die Intervalle nicht richtig gelöscht hatte.

3. Und last but not least: Eine statische Animation (Tweens). Hier, so glaube ich, hatte es damit zu tun, dass die Animation bildschirmfüllend war und aus nachgezeichneten Bitmaps bestand, die, wie man weiss, sehr performance-belastend sind.


Abschliessend dazu kann ich bloss sagen, dass ich bis auf die geloopten hitTests(hütet euch alle;)) alle oben genannten Sorgenkinder in ähnlichem Rahmen auch schon problemlos einsetzen konnte.

Wie man mit einer intensiven :google:-Session erfahren kann, sind Flasher weltweit an der Demystifizierung der Garbage Collection gescheitert.
Ich persönlich denke, dass wenn man Flash nicht wie AfterEffects einzusetzen versucht, die Performance eines Projekts schon in die Konzeption einbezieht und man einen sauberen Programmations- und Kreationsstil pflegt (keine zugemüllten Bibliotheken usw), man schon mal den einen 90% des Risikos auf einen Overkill aus dem Weg gehen kann.

Zu den Videos: Wenn es sich um eine grössere Sequenz handelt, die in AfterEffects oder Ähnlichem erstellt wurde, halt ich es für unsinnig, mit Bitmap-Sequenzen zu arbeiten. Die einfachen Methoden., mit Videos zu arbeiten halt ich für einen den grössten Vorteile von Flash 8.

gruss
 
Hi,

danke für die Infos. Mit hitTest arbeite ich glücklicherweise sehr selten (wenn dann nur, wenn ich eine Überprüfung komplexerer Formen (Shape-Flag) benötige). Falsch gehandelte Intervalle (und Listener!) können einen allerdings zur Verzweiflung brigen. ;)

Ich denke kaum, dass dem Threadersteller mit einem gestreamten Video (flv) geholfen wäre; immerhin geht es auch um schnelle Richtungswechsel. Ein eingebettetes AVI o.ä. sollte allerdings schon was bringen (lässt sich ja wie einen MC handeln - die Sourcedatei sollte nur nicht zu wenige Keyframes haben).

Gruß
.
 
Nachtrag zu obigem Beitrag:

Was auch zu einer extremen RAM-Entlastung führen kann, ist die Verwendung von removeMovieClip, statt unloadMovie.

@pixelmord: Poste doch mal dein Script, vielleicht lässt sich da eine Performance-Schwachstelle der erklärbaren Art ausmerzen ;).

gruss

PS: :offtopic:
@Tobi: Ein Performance-Guide wär auch nett.:p..wenn ich nur nicht so viel zu tun hätte :(
 
luke_the_duke hat gesagt.:
Nachtrag zu obigem Beitrag:

@pixelmord: Poste doch mal dein Script, vielleicht lässt sich da eine Performance-Schwachstelle der erklärbaren Art ausmerzen ;).

Sorry, hatte auch grad ein bischen viel zu tun.

Danke nochmal für die interessanten Infos, Garbage-Collection ist ein blödes Thema, hab mich da schon schwarz und dämlich geärgert bei 3DStudio max, dort müllt sich die Datei durch mergen von Objekten zu und wird größer und größer...Aber das nur so am Rande.

Das Flash-Projekt in dem der Fehler auftrat ist ein wenig älter, nur will ich jetzt so etwas nochmal machen und nicht wieder solche Probleme haben.

Hier die Daten von der alten Geschichte, erstellt mit FlashMX 2004:

Mein Code ist sehr hemdsärmlig geschrieben, weil ich den Film dreimal in der Nacht vor Abgabetermin komplett geändert habe, weil ich das beschriebene Problem ausmerzen wollte. Aber im Endeffekt hab ich das dann durch Hardware erschlagen.

Die Animationen mit den Bildsequenzen werden extern geladen durch einen Button, über den je nach ausgewählter MaterialOptik der entsprechende Satz an Mcs eingefügt wird.
Code:
on (release) {
	unloadMovie(this.camera);
	unloadMovie(this.orbit);
	unloadMovie(this.zoomhi);
	unloadMovie(this.zoomlo);
	loadMovie("orbit01.swf", this.orbit);
	loadMovie("zoomhi01.swf", this.zoomhi);
	loadMovie("zoomlo01.swf", this.zoomlo);
	loadMovie("camera01.swf", this.camera);
}
Hier wäre ja schon mal das erwähnte"removeMovieClip" möglich....
Die MCs haben alle 84 Frames mit 640 x 480 px großen Bildern, die Animation lief auf einer Messe auf einem Touchscreen.

Gesteuert wurden die Mcs mit folgendem Script(Beispiel: orbit.swf):
Code:
onClipEvent (load) {
	this.gotoAndStop(this._parent.orbitframe);
	mymousex = this._width / 2;
	oldspeed = 1;
}
onClipEvent (enterFrame){
	if (this._parent.gohome == 1 && this._alpha > 0) {
				if (this._currentframe == 1) {
					this._parent.orbitframe = 1;
					this._parent.gohome = 0;
					this._parent.gotoAndStop(this._parent.gowhere);
				} else {
					this.gotoAndStop(this._currentframe - 1);
				}
	}
	if(_parent.drag == true && this._alpha > 0){
		difx = (this._xmouse - mymousex)/10;
		if(difx > 0 && difx < 1){difx += 1;}
		if(difx < 0 && difx > -1){difx -= 1;}
		movespeedx = Math.round(difx);
		if(movespeedx > 20){movespeedx = 20;}
		if(movespeedx < -20){movespeedx = -20;}
		if (movespeedx != 0){
			moveto = this._currentframe + movespeedx;
			} else {
				moveto = this._currentframe + oldspeed;
			}
			if (moveto <= 0){moveto = 84 + moveto;}
			if (moveto >= 85){moveto = moveto - 84;}
			this.gotoAndStop(moveto);
			this._parent.orbitframe = moveto;
			if (movespeedx != 0){
				oldspeed = movespeedx;
			}
		}
	mymousex = this._xmouse;
}

Elegant ist das nicht, aber was solls...
 
das unload auf dein Button kannst du weg lassen da es eh ausgetauscht wird
und dann würde ich es mit mouseMove und ein updateAfterEvent probieren statt es als enterFrame kontrollieren zu lassen
 
umlart hat gesagt.:
das unload auf dein Button kannst du weg lassen da es eh ausgetauscht wird
und dann würde ich es mit mouseMove und ein updateAfterEvent probieren statt es als enterFrame kontrollieren zu lassen

Ich glaub das unload ist eben drin, damit der Speicher wieder frei wird....

Das mit der Steuerung per enterFrame ist wie gesagt nicht sehr elegant, aber ich hab da ja die ganze Zeit mit der Performance gekämpft.... glaubst Du denn das eine Umstellung in dem Part das Problem mit dem Datenmüll lösen würde?
 

Neue Beiträge

Zurück