2016-08-07 20 views
1

Ich versuche, unserer UI einen "On-Fire-Effekt" hinzuzufügen. Ich erreiche dies mit BitmapData und PerlinNoise und einigen anderen.Scaleform BitmapData: Ungültige Bitmapdata

Das Problem kommt, wenn alles, was ich mit dem BitmapData- tun, um diesen Fehler verursacht:

ArgumentError: Error #2015: Argument error: Invalid BitmapData. 
    at effects::FireFX/updateBitmaps()... 

Etwas so einfach wie dies der Fehler führen zu zeigen.

displayBmp = new BitmapData(200, 200, true, 0); 
scratchBmp = displayBmp.clone(); 

In meinem Fall funktioniert wie clone() oder perlinNoise() oder colortransform .... etc ... verursachen den Absturz.

Debuggen/Ausführen unter Animate CC funktioniert gut.

PD: Publishing auf 10,3 Blitz, mit Scaleform: 4.1.19

Dank

+0

Fehler 2015 kann durch Null Breite oder Höhe der BitmapData verursacht werden – www0z0k

+0

Überprüfen Sie, ob Sie nicht aus dem Speicher gehen. – Vesper

+0

Funktioniert es, wenn Sie nicht mit Scaleform arbeiten? Verwenden Sie nur AS3-Code zum Deklarieren von 'var displayBmp: BitmapData;' und 'var scratchBmp: BitmapData;' Ich könnte dann Ihren angezeigten Code verwenden, um ohne Probleme zu klonen. Sogar "scratchBmp.width" als 200 verfolgt. Vielleicht sollten Sie einen ** vollständigen aber minimalen ** Code für uns veröffentlichen, um Ihr Problem zu testen/neu zu erstellen. –

Antwort

1

Scaleform funktioniert die BitmapData- API unterstützt, ab Version 4.1 (reference). 4.1.19 war jedoch das erste Release von 4.1 und damit die erste Veröffentlichung mit BitmapData-Unterstützung. Möglicherweise möchten Sie auf eine neuere Version upgraden, da es seit der ersten Veröffentlichung der BitmapData-Unterstützung sicher Fehler gab.

Der häufigste Grund, um diesen Fehler zu erhalten, besteht darin, keine ThreadCommandQueue Instanz in MovieDef::CreateInstance als letzten Parameter zu übergeben, und BitmapData-Operationen werden im ersten Frame verwendet. Ohne eine Instanz von ThreadCommandQueue kann der Renderer die Sicherung für die BitmapData-Objekte in Scaleform nicht erstellen. In späteren Versionen wurde Scaleform eine aussagekräftigere Warnung hinzugefügt.

Für ThreadCommandQueue müssen Sie dies in der Regel selbst implementieren, damit es ordnungsgemäß in den Rendercode Ihrer Anwendung integriert wird. Die einfachste Multithread-Implementierung würde einfach ThreadCommand Objekte in einer (Thread-sicheren) Liste speichern, wenn sie von PushThreadCommand aufgerufen werden, und Execute für die Objekte an einem bestimmten Punkt während der Anwendungs-Rendering-Schleife aufrufen.

In späteren Versionen des SDK gibt es eine Klasse namens SingleThreadedCommandQueue, die eine grundlegende Implementierung bietet, die alle Befehle sofort ausführt. Dies funktioniert nur, wenn Sie Movie::Advance und HAL::Display für denselben Thread verwenden. Sie können eine komplexere Version einer ThreadCommandQueue-Implementierung sehen, die in den Scaleform-Beispielen aus der Klasse RenderHALThread verwendet wird, die die meisten wichtigen Implementierungen auf RTCommandQueue verschiebt.

+0

Danke für die Antwort, sehr geschätzt. Wie gehe ich vor, um eine RenderThread-Klasse zu initialisieren, um sie an den HAL-Konstruktor weiterzuleiten, finde keine Dokumentation dazu. – Fredaikis

+0

Die Klasse 'RenderThread' ist nicht wirklich erforderlich. Sie könnten die in den Beispielen (in Src/Platform) verwenden, wenn Sie wollten. Wenn Sie eine Rendering-Anwendung mit mehreren Threads integrieren, müssen Sie nur eine Implementierung von ThreadCommandQueue bereitstellen. Wenn Sie single-threaded sind, können Sie SingleThreadedCommandQueue (http://help.autodesk.com/view/SCLFRM/ENU/?guid=__cpp_ref_06044_html) verwenden. – MuertoExcobito

+0

Ich kann keine Instanz von ThreadCommandQueue erstellen, da die Klasse praktisch leer ist. Keine Möglichkeit zu initialisieren oder in irgendeiner Weise zu implementieren. Ich habe auch nicht die SingleThreadedCommandQueue. – Fredaikis