Animation läßt RAM-Verbrauch immer weiter steigen

pixelmord

Mitglied
Hallo,

ich suche dringend nach einer Lösung/Erklärung für folgende Problemstellung:
Ich habe einen Hauptfilm aus dem heraus ein swf-Clip mit einer Bildsequenz geladen wird, die dann durch Mausbewegung vorwärts oder rückwärts abgespielt wird, nach dem Motto "Maus nach rechts -> Zeitleiste vorwärts bis zum Ende der Sequenz und dann wieder weiter von Frame01...und immer weiter" oder umgekehrt, das Ganze geschwindigkeitsabhängig je nach Mausbewegung. Gesteuert wird das per AS.

Alles funktioniert wunderbar, bis auf die Tatsache, daß die RAM-Auslastung je länger die Animation mit der Bilsequenz benutzt wird immer weiter steigt bis der Rechner in die Knie geht. RAM-Auslastung geht da gerne über 1 GB und mehr hinaus.
Wird rechtzeitig ein anderer gleichartiger MC(auch mit Bildsequenz) in den Container geladen, entspannt sich die Auslastungssituation wieder bis zu dem Zeitpunkt, daß auch hier wieder zu lange mit der Animation rumgespielt wird.

Ach so: Ist natürlich eine Offline-Applikation mit Bildsequenzen von z.B. 32 Frames a 640 x 480 px.

Hoffe, Ihr habt eine Idee woran das liegen könnte oder was ich verbessern könnte.

Vielen Dank
 
Hi,

ohne einen Blick in dein Script lässt sich da nur raten was falsch läuft!?.
Läuft das ganze mit einem Intervall!? Wenn ja dann musst den Intervall auch wieder löschen.
 
Hi,
ist mir neu, vielleicht cached Flash irgendwie Inhalte auf benachbarten Frames? Eine dynamische Bildfolge (erst recht eine mit wechselnder Geschwindigkeit) würde ich nicht unbedingt über die Zeitleiste realisieren, sondern wahrscheinlich durch das ein- und Ausblenden verschiedener MovieClips.

Ein anderer Vorschlag: Wenn Du sagst, dass der Verbrauch beim Neuladen eines MC wieder sinkt, packe doch die ganze Animation in einen MovieClip, den Du jedes Mal, wenn die Abspielgenze (erster Frame/letzter Frame) erreicht ist, mit sich selbst überschreibst (attachMovie). ;)

Gruß
.
 
Tobias Menzel hat gesagt.:
Hi,
ist mir neu, vielleicht cached Flash irgendwie Inhalte auf benachbarten Frames? Eine dynamische Bildfolge (erst recht eine mit wechselnder Geschwindigkeit) würde ich nicht unbedingt über die Zeitleiste realisieren, sondern wahrscheinlich durch das ein- und Ausblenden verschiedener MovieClips.

Ein anderer Vorschlag: Wenn Du sagst, dass der Verbrauch beim Neuladen eines MC wieder sinkt, packe doch die ganze Animation in einen MovieClip, den Du jedes Mal, wenn die Abspielgenze (erster Frame/letzter Frame) erreicht ist, mit sich selbst überschreibst (attachMovie). ;)

Gruß
.

Das mit dem ein- und ausblenden wüßte ich nicht wie ich das realisieren sollte...

Der 2te Vorschlag hört sich schon besser an, aber ich befürchte, daß zum einen bei attachMovie ein Bildflackern zu sehen sein wird im Moment des Wechsels vom letzten Frame - attachMovie - erster Frame.
Außerdem meine ich, daß das nur das halbe Problem löst, da die Performance-Probleme auch auftauchen, wenn man die Grenze letzterFrame/ersterFrame nicht "überschreitet".

Vielleicht kann man statt der Bildsequenz ein Video einbinden? Habt Ihr da Erfahrung, kann man sich da dynamisch vorwärts - rückwärts bewegen, loopend auch am Ende wieder an den Start und umgekehrt. Es sollte halt eine "nahtlose" Animation sein.

Zum besseren Verständnis: Es geht um Animationen von 3D-Modellen, mittels der Bildsequenzen wird gedreht, gezoomt usw.
 
Hi,

wenn Du ein Video statisch einbettest, lässt sich dieses wie ein MovieClip ansteuern (also auch vor- und zurückfahren). Das Problem dürfte dadurch allerdings nicht unbedingt aus der Welt zu schaffen zu sein (probieren könntest Du es natürlich).

Ein Ein- und Ausblenden per AS wäre bei großen Bildern u.U. in der Tat unperformant - ohne eine genauere Kentniss Deiner Daten wäre aber auch das zumindest einen Versuch wert.

Beispiel mit _visible:
Code:
var current = 1; // aktuelles Bild
var amount = 50; // Anzahl Bilder

function showFrame(nr) {
    this["frame" + nr]._visible = true;
    this["frame" + current]._visible = false;
    current = nr;
}

function forward() {
    this.onEnterFrame = function() {
        var c = (current < amount) ? current + 1 ; 1;
        showFrame(c);
    }
}
Alle Frames müssten sich hierbei als MCs auf der Bühne befinden und durchnummerierte Instanznamen bekommen: frame1, frame2, ... usw. Zudem müssten alle Clips zuerst unsichtbar geschaltet werden (_visible = false).

Gruß
.
 
Ah jetzt habe ich verstanden, was Du mit "ein- und ausblenden" meinst.
Ich werde mal die performance testen und geb dann Bescheid.

Das mit den externen MCs und den Bildsequenzen war für mich nur deshalb besser, weil die Organisation einfacher zu bewerkstelligen war. Es sind nämlich 3 unterschiedliche Animationen( drehen, zoomen und drumrumfliegen) und das in 6 unterschiedlichen Farb- bzw. Materialvarianten der 3D-Modelle und es sollte möglich sein auch bei einem bestimmten Bild das Material zu wechseln ohne wieder an den Anfang zurückzuspringen.
Das sind dann bei der o.g. Methode echt ein Haufen MCs... bei 30 Bildern Ani sind das schon 540 verschiedene Frames.
Müßte man dann sicherlich doch aus der Bibliothek die Einzelbilder attachen, wäre einen Test wert, ob das ohne Bildruckler zur Laufzeit geht.

Das mit dem Video schau ich mir auch mal an, da muß ich mich nur erst einarbeiten, ist ein ganz neues Feld für mich...


Vielen Dank erstmal für Deine Tips! :)
 
Hallo,

dein Problem lässt sich mit der schlecht (bzw gar nicht) gemanagten Garbage Collection von Flash erklären, die zwar laut Entwickler bei v8 des Flash Players um satte 20% besser sein soll, aber halt noch immer nicht akzeptabel.
Kurz: Unter Garbage Collection versteht man den angesammelten "Müll", Daten, die den temporären Speicher belegen, eigentlich aber nicht mehr benötigt werden, aber nur dann gelöscht werden können, wenn das verursachende Programm die Daten auch freigibt.

Ich bin da nicht sooo sattelfest, googel doch einfach mit dem Begriff Garbage Collection, um dich besser zu informieren.

gruss
 
Zuletzt bearbeitet:
@luke: Meines Wissens gibt es für den Entwickler keine Möglichkeit, den Garbage Can manuell zu löschen, oder?

Wie dem auch sei: mich erstaunt allerdings etwas, dass das Problem auch bei statischen Zeitleisteanimationen auftritt - wenn das der Fall ist, ist das Ding m.E. recht schlecht gemanaged. ;)

Gruß
.
 
@Tobi: Richtig! Man kann bloss versuchen, den Overkill zu vermeiden, indem man "sauber"
arbeitet.

Wenn ich mich recht erinnere, hatte ich das oben beschriebene Problem bisher etwa 4mal in meiner ganzen Flash-Karriere, bei statischen Anis, sowie auch bei gescripteten Vorgängen. Ich musste z.T. den ganzen Film neu schreiben, es ist mir aber noch nie gelungen, einen gemeinsamen Nenner für all die Situationen zu erschliessen, mit dem man so ne Art Faustregeln formulieren könnte. Für mich bedeutete es einfach jedes Mal ein totales Umdenken und Neuschreiben. Das Thema interessiert mich aber brennend, sollte jemand hier mehr zum Thema wissen, her damit ;).

gruss
 
Hi,

leider kann ich nicht sehr viel dazu sagen, da ich von dem Problem bisher kaum betroffen war. Mich würden allerdings tatsächlich die von Dir erwähnten Situationen und die jeweiligen Lösungen interessieren (sofern sich diese kurz umschreiben lassen ;)).

Bist Du aufgrund Deiner Erfahrungen mit der Speicherauslastung der Meinung, dass beim vorliegenden Problem eine Umstellung von Bitmaps in Schlüsselbildern auf ein eingebettes Video sinnvol wäre? Speicherfreundlicher wäre ein Video ja auf jeden Fall.

Gruß
.
 

Neue Beiträge

Zurück