Frage

Meine Website basiert vollständig auf Flash. Sie bewegt sich um ein 3D-Modell herum, das mir in Form von Videostücken zur Verfügung gestellt wurde, die ich in FLV-Dateien konvertiert habe.Ich verwende die FLVPlayback-Komponente, um das Video in meinem Programm zu steuern.Beim Durchführen von Speicherüberprüfungen mit System.totalMemory ist mir aufgefallen, dass jedes Mal, wenn ein Video geladen wird, es einen Teil des Speichers verbraucht, und selbst wenn ich alle Ereignis-Listener daraus entferne (sie sind alle schwach referenziert), entferne ich die Komponente aus Wenn Sie das übergeordnete Element löschen, das Video stoppen und die Komponenteninstanz auf Null setzen, wird der Speicher trotzdem nicht zurückgegeben.

Das stört mich, seit ich mit der Arbeit an diesem Projekt begonnen habe, da ein Benutzer möglicherweise eine große Menge an Videos instanziieren und laden kann.Derzeit wird jedes Video bei Bedarf in eine neue FLVPlayback-Instanz geladen, aber ich habe gelesen, dass der beste Weg, dieses Problem zu lösen, darin besteht, einfach eine globale FLVPlayback-Instanz zu haben und das neue Video auf diese Weise einfach in die alte Instanz neu zu laden Es gäbe nur eine FLVPlayback-Komponente im Speicher der Anwendung.

Hat jemand anderes dieses Problem auch gehabt?Haben Sie eine bessere Lösung gefunden als die Verwendung einer globalen Instanz, die Sie einfach für jedes neue Video wiederverwenden?

War es hilfreich?

Lösung

Sie können den Speicherproblemen leider nicht viel entgegensetzen, bis Flash Destruktoren und explizite Objektlöschung hinzufügt.Siehe diesen Thread:

Entladen eines ByteArray in Actionscript 3

Es gibt eine Grenze dafür, wie viel Speicher Flash-Applets verwenden können.Der GC scheint bei Erreichen dieser Grenze auszulösen.Ich habe gesehen, dass meine speichereinfachen Applets bis zu ca. 200 MB verbrauchen, nur weil sie stundenlang laufen und der GC nicht einspringen will.

Oh, und ich glaube auch nicht, dass die Verwendung einer einzelnen Instanz eine elegante Lösung ist.Derzeit schreibe ich nur eine dispose()-Funktion für meine benutzerdefinierten Klassen und warte darauf, dass sie eines Tages in einen richtigen Destruktor umgewandelt werden kann.

Andere Tipps

Die Komponenten haben mir nie wirklich gefallen, sie sind etwas zwielichtig.Dieses spezielle Problem scheint häufig vorzukommen, und die etwas lästige Lösung besteht, wie Sie vorschlagen, darin, nur ein FLVPlayback zu haben und dieses wiederzuverwenden.

Hier ist ein Blogbeitrag darüber

Vielen Dank für die Antworten, die Links zu den anderen Blog-Fragen waren ebenfalls hilfreich. Ich hatte auch alle Informationen von Grant Skinner zur Garbage Collection gelesen, aber das Durchsuchen dieser Links und das Zurückgehen und erneute Lesen dessen, was er ursprünglich über GC gesagt hatte, hat geholfen Erfrischen Sie den alten Noggin.Zusätzlich zum Nullsetzen und erneuten Instanziieren dieser einzelnen FLVPlayback-Komponente habe ich auch festgestellt, dass ich meine Loader-Instanzen auch nicht korrekt entladen und zerstört habe, also habe ich sie bereinigt und jetzt läuft das Programm viel effizienter.Ich würde sagen, dass sich die Speichernutzung der Website um etwa 90 % verbessert hat.

@aib Ich gebe zu, dass die Einzelinstanzlösung nicht elegant ist, aber da Flash diese FLV-Dateien einfach nicht loslässt, bleibe ich irgendwie dabei.

@grapefrukt Ich verabscheue die Flash-Komponenten, sie verursachen normalerweise mehr Ärger als Zeitersparnis, aber in diesem Fall hatte ich viele Cue-Points und Navigationskram mit den Videodateien und die FLVPlayback-Komponente war die beste Lösung, die ich gefunden habe.Natürlich bin ich noch ziemlich neu in der Actionscript-Welt, also habe ich vielleicht etwas übersehen

Ich wünschte auch, ich hätte den Ruf, beide Ihrer Antworten positiv zu bewerten, weil sie beide hilfreich waren ...so ist das Leben

Nach vielen Tests habe ich herausgefunden, dass Flash Bibliotheken und Komponenten nach Bedarf dynamisch lädt, diese Daten jedoch nie durch Müll sammelt.Wenn ich beispielsweise eine Website oder eine Air-App habe, die die FLVPlayback-Komponente verwendet, werden die eigentliche Komponente und die damit verbundenen Bibliotheken erst geladen, wenn eine neue FLVPlayback()-Instanz erstellt wird.Anschließend werden die Bibliothek und die Komponente in den Speicher geladen, aber Sie erhalten diesen Speicherplatz erst zurück, wenn das Programm/die Website geschlossen wird.Bei dieser speziellen Instanz mit dem darin enthaltenen Video wird der Müll gesammelt und etwas Speicher freigegeben, solange Sie Zuhörer daraus entfernen, sie von der Bühne entfernen und sie auf Null setzen.

Wenn Sie einzelne Videos erstellen, ist der VideoPlayer außerdem viel leichter und lässt sich besser aufräumen.

Leider geht Flash genau so damit um.Nicht besonders intelligent, aber es funktioniert für die meisten Menschen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top