Zurück   Flashforum > Flash > ActionScript > ActionScript 3

Antwort
 
LinkBack Themen-Optionen Ansicht
Alt 31-07-2010, 21:24   #1 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 20
Question „ByteArray zu Bild“-Performance Problem mit EventDispatcher lösen?

Hallo Ihr,
nach ziemlich langem, erfolglosem Herumprobieren habe ich mich jetzt entschlossen doch mal die Experten zu konsultieren. Ich habe folgendes Problem:

Ich bekomme in mein SWF per Socket eine ganze Menge Bilder als ByteArrays. Die wandle ich dann per Loader.loadBytes() via BitmapData DER REIHE NACH in Bitmaps um. Das klappt alles gut so weit. Der Loader triggert über ContentLoaderInfo Events eine Funktion, die das Bild zeichnet, wenn es geladen wurde. Die Funktion sieht so aus:
Code:
var loaderInfo:LoaderInfo = event.target;
var bildData:BitmapData = new BitmapData(picWidth, picHigh, true, 0x00000000);
bildData.draw(loaderInfo.content);
var bild:Bitmap = new Bitmap(bildData);
picContainer.addPic(bild);
Leider musste ich feststellen, dass diese ContentLoaderInfo Events nur im Rhythmus der SWF Frame Rate schießen, was in meinem Fall eine unglaubliche Zeitverschwendung ist. Also habe ich das Konzept geändert: nicht mehr der Reihe nach sondern „gleichzeitig“. Das ging einfach. Über eine For-Schleife werden so viele Loaderobjekte erzeugt wie Bilder geladen werden sollen. Das Ergebnis ist, dass das Laden jetzt super schnell geht.
Für die Performance des SWFs war das allerdings nicht so toll. Es müssen nämlich noch ein paar Mausinteraktionen des Users behandelt werden. Das Problem wollte ich mit einen EventDispatcher lösen. Alle Loads werden nach wie vor in einem Loop abgearbeitet aber die oben gezeigte Funktion soll durch einen EventDispatcher zusammen mit den Mausaktionen priorisiert dispatched werden. Immer wenn ein Bild umgewandelt wurde bekommt der EventDispatcher einen Funktionsaufruf um ein Event zu generieren, was dann die nächste Bildumwandlung triggert. Und wenn Mausevents zwischendurch auftauchen haben die eine hoehere Prioritaet... So weit die Idee, es geht aber nicht, alle Bildumwandlungen werden nach wie vor in einem Block durchgeführt.
Meine Vermutung ist, dass Flash während der Umwandlung (also während des Ausführens des oben gezeigten Codes) keine MauseEvents abfängt. Darum meine Frage: Ist das hier beschriebene Konzept einfach nur doof oder kann Flash das nur nicht? Oder habt Ihr sogar eine bessere Idee?
Vielen Dank und viele Gruesse,
Hannes
Hannes1 ist offline   Mit Zitat antworten
Alt 01-08-2010, 02:22   #2 (permalink)
in the boondocks
 
Benutzerbild von shin10
 
Registriert seit: Feb 2006
Ort: Augsburg
Beiträge: 3.496
hi hannes,

nur um mir schonmal ein besseres bild machen zu können... wieviele bilder sind es, wie groß sind diese in etwa und wie oft bzw. in welchem fall lädst du die bilder nach?

gibt es eigentlich einen grund (swf/jpg, skalieren, schneiden ...), dass du die nachgeladenen bitmaps mit draw erst nochmal in ein anderes bitmap zeichnest, anstatt es mit
PHP-Code:
picContainer.addPic(loaderInfo.content); 
gleich zu übergeben?

mfg

sx
__________________

flintfabrik.de
shin10 ist offline   Mit Zitat antworten
Alt 01-08-2010, 12:28   #3 (permalink)
Neuer User
 
Registriert seit: Jan 2004
Beiträge: 20
Hi shin,
danke für die schnelle Antwort. Momentan sind es 600 Bilder aber recht klein so um 6,5KB pro Bild. Die Bilder werden alle hintereinander weg geladen. Den loaderInfo.content kann ich leider nicht direkt als Bild der Buehne hinzufuegen, da es an der Stelle noch kein Bild ist. Ich bekomme die Bilder via Socket als Bytestream rein. Der Loader wandelt mir das um, in ein IBitmapDrawable und das befindet sich dann in dem loaderInfo.content.
Was genau der Loader da macht ist mir ehrlich gesagt unklar. Ich habe mir im Debugmodus mal die Inhalte von dem ByteArray (vor dem Load) und von dem loaderInfo.content (nach dem Load) angesehen. Interessanter Weise ist beides letztlich ein ByteArray aber leider nicht das selbe darum konnte ich bis jetzt nicht auf den Loader verzichten.
Ich habe übrigens jetzt eine wenig elegante Lösung gefunden, die immer noch nicht 100% performant aber bis jetzt das beste ist: Nach dem die oben beschriebene Umwandlung abgeschlossen ist lass ich mit einem Timer 2 Millisekunden warten bevor ich das Event starte. Das gibt möglichen MausEvents die Möglichkeit „durchzuschlüpfen“.
Vielen Dank und viele Gruesse,
Hannes
Hannes1 ist offline   Mit Zitat antworten
Antwort

Lesezeichen

Stichworte
bitmap, eventdispatcher, loader, performance

Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge hochzuladen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks sind an
Pingbacks sind an
Refbacks sind an


Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Problem ByteArray laden Jochi ActionScript 3 1 25-02-2010 16:34
Problem mit ByteArray szallah ActionScript 3 1 26-08-2009 02:34
Problem mit EventDispatcher kakktus ActionScript 2 13 15-03-2006 13:46
erstes weisses bild - performance problem jlo Flash MX 3 22-07-2003 13:31
Ein Problem, weiss nicht wie zu lösen! FLASHStyler HTML und CSS 8 26-05-2003 21:11


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:19 Uhr.

Domains, Webhosting & Vserver von Host Europe
Unterstützt das Flashforum!
Adobe User Group


Copyright ©1999 – 2012 Marc Thiele