Frage

Ich baue ein Remote-Präsentations-Tool in AS3. Auf dem Punkt gebracht, hat ein Benutzer (der Moderator) Zugriff auf ein „Inhaltsverzeichnis“ HTML-Seite mit Links für jede Folie in der Präsentation, und eine beliebige Anzahl von Zuschauern kann die Präsentation auf einer anderen Seite sehen, die wiederum in der ist Form einer SWF, dass Umfragen der Server jede Sekunde, um sicherzustellen, dass es auf der rechten Rutsche ist. Jedes Mal, wenn der Administrator eine Schiebeverbindung in den TOC klickt, wird die Datenbank aktualisiert, und auf seiner nächsten Anfrage vergleicht die Präsentation swf das Etikett des Schlittens es zur Zeit ist die Antwort angezeigt wird es vom Server erhielt. Wenn die Antwort unterscheidet sich von dem aktuellen Etikett, die swf scheuert durch die Timeline, bis er den richtigen Rahmen Etikett findet; sonst, es tut nichts und wartet auf die nächste Umfrage Ergebnis (eine Sekunde später).

Jede Folie besteht aus einem Movieclip mit einer eigenen verschachtelten Timeline, dass Schleifen, solange die Folie angezeigt wird. Es gibt keinen Actionscript einen der verschachtelten Videoclips zu steuern, noch gibt es eine Actionscript auf der Hauptzeitleiste mit Ausnahme der stop();s auf jedem Keyframe (von denen jeder eine Folie in der Präsentation).

Alles ist gebaut und gut funktionierend. Das einzige, was beunruhigend ist, dass, wenn die Präsentation swf offen für lang genug ist (sagen wir, 20 Minuten), die Abfrage einen spürbaren Effekt auf die Framerate der Videoclips auf einem bestimmten Dia Animieren zu haben beginnt. Das heißt, jede Sekunde, gibt es einen spürbaren Rückgang in der Framerate der Animationen, die etwa drei Zehntelsekunden dauern, die deutlich spürbar ist (und damit ein Deal-Breaker für die gesamte Präsentation Suite ist!).

Ich weiß, dass AS3 Probleme mit Speicherverwaltung hat, und ich habe versucht, fleißig in meiner Wiederverwendung von Objekten und Ereignis-Listener zu sein. Der Code selbst ist einfach tot; es gibt eine Instanz Timer, dass jeder zweite feuert, die eine new URLRequest löst durch eine URLLoader geladen werden. Der URLLoader von Anruf zu Anruf wiederverwendet wird, während die URLRequest nicht (es muss von einem Aufruf new Date().time mit einem neuen Cache-Tötung Wert jedes Mal abgerufen initialisiert werden). Die einzige in der gesamten Klasse instanziiert Objekte sind die Timer, die URLLoader, die verschiedenen URLRequests, und die einzige Veranstaltung Zuhörer sind auf der Timer (hinzugefügt einmal), die URLLoader (hinzugefügt einmal) (das sollte Garbage Collection sein) und auf die Routinen, dass Gestrüpp rückwärts und vorwärts in der Zeitleiste die richtige Folie zu finden (und sie entfernt ist, sobald die richtige Rutsche gefunden wird).

Ich habe mit mr doob Statistik-Paket Monitor Speichernutzung , die auf jeden Fall im Laufe der Zeit wächst, so ist es Gotta ein Leck irgendwo zu sein (es von ~ wächst 30 MB zunächst auf> 200 MB nach einigen Schrubben und etwa 25 Minuten Betriebszeit).

Hat jemand irgendwelche Ideen, was könnte die Performance-Probleme verursachen?

UPDATE: Ich bin nicht ganz sicher, ob die Performance Probleme direkt in dem Speicher gebunden; Ich lief für eine Instanz der Präsentation swf etwa 15 Minuten und obwohl die Speichernutzung nur auf rund 70 MB geklettert (und blieb dort), ein spürbarer Schluckauf begann in Intervallen von einer Sekunde erscheinen, mit der Wahl Anrufen zusammenfällt (über Firebug Net Panel verfolgt ). Was sonst noch Ursache Stottern Videoclips?

War es hilfreich?

Lösung

Ich weiß, dass dies ein bisschen spät kommt, aber ich habe oft Flash Builder Profiler wurde mit und eine Sache, die ich gefunden, dass der TimerEvent durch die Timer-Klasse erzeugt

  1. verbraucht ziemlich viel Speicher individuell und
  2. scheint nicht richtig während der Garbage Collection freigegeben werden (auch wenn Sie den Timer gestoppt und entfernt alle Verweise auf sie).

Ein neues Ereignis wird für jeden Timer tick erzeugt. Ich benutze setInterval statt, obwohl ein paar AS3 Evangelisten dagegen zu empfehlen scheinen. Ich weiß nicht, warum. setInterval erzeugt noch Timer-Ereignisse, aber sie erscheinen Garbage Collection richtig im Laufe der Zeit sein.

So eine Strategie kann sein, dass

  1. Sie den Timer mit einem Aufruf an setInterval() ersetzen ... die wohl robusten Code ist sowieso und
  2. (VORSICHT) Kraft Garbage Collection auf jede Folie Gestrüpp (aber nicht an jeder Umfrage). Siehe diese Frage für weitere Details über die Vor- und Nachteile.

Der zweite Vorschlag ist nur eine Notlösung. Ich ermutige Sie wirklich die Profilierungs Tools zu verwenden, um das Leck zu finden. Flash Builder Pro verfügt über eine 60-Tage-Testversion Das könnte helfen.

Wenn schließlich eine völlig neue Folie SWF zu bewegen (keine neue Timeline-Position in der aktuellen Folie), wie machen Sie sicher, dass die vorherige Folie SWF wurde ordnungsgemäß entladen? Oder bin ich Missverständnis Ihr Setup und es gibt nur eine aktuelle Dia SWF?

Andere Tipps

Nur zwei Dinge, die mir in den Sinn kam:

  • Je nach Version des Flash-Players und der CPU-Auslastung der Garbage Collection manchmal tut nicht starten, bevor 250 MB (oder sogar mehr) Speicher verbraucht werden.
  • Moviesclips, Sprites, Loader und was auch immer das ein Eventlistener Hören hat, werden nicht von der Garbage Collection getötet werden.

Also ich glaube, Ihr Problem ist, dass entweder das Dia oder der Lader nicht richtig gereinigt werden, nachdem Sie sie benutzten, so dass die keept in Erinnerung waren.

Ein guter Punkt zu lesen beginnen: http: // www. gskinner.com/blog/archives/2006/06/as3_resource_ma.html

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