2013-06-26 29 views
1

我正在開發使用Adobe Air的iPad應用程序。AS3異步位圖創建iOS

當應用程序啓動時,我已將所有圖像加載到BitmapData對象中。然後我只需要創建Bitmap對象(它們只是容器)來使用存儲在BitmapData對象中的像素。

這工作正常,直到我必須創建一個大圖像Bitmap對象。該應用程序速度減慢,甚至凍結,最多1秒鐘。

由於AS3是單線程的,因此我無法將Bitmap創建委託給新線程。此外,如果UI被凍結,我無法展示一個體面的微調器來通知用戶「有什麼事情正在進行」。

我該如何解決這個問題? 有沒有辦法在不影響UI性能的情況下並行創建對象?

回答

0

那麼它似乎答案是簡單了很多,和Adobe已經想到這一點。

http://help.adobe.com/en_US/as3/dev/WS52621785137562065a8e668112d98c8c4df-8000.html

的問題是,即使圖像加載到BitmapData對象,他們還是老樣子沒有解碼。這就是爲什麼較大的圖像需要一段時間才能放入Bitmap對象。

解決方案與使用指令在圖像加載時強制進行圖像解碼一樣簡單,而不是在您需要它們時。這是使用ImageDecodingPolicy.ON_LOAD完成的。

var loaderContext:LoaderContext = new LoaderContext(); 
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD; 
var loader:Loader = new Loader(); 
loader.load(new URLRequest("http://www.adobe.com/myimage.png"), loaderContext); 
+1

這樣做的更常見(儘管不正確)方式是簡單地調用您希望加載到內存中的BitmapData上的「BitmapData.getPixel(0,0)」。這將解碼數據以獲得像素(並且也將在嵌入式圖像上工作)。請注意,解碼圖像會將_uncompressed_圖像加載到內存中。由於您可以在iOS中使用少量的RAM,並且運行時間有多大,這可能會非常快速地成爲問題。 –

+0

謝謝@JoshJanusch我會留意記憶。到目前爲止,上述解決方案非常有效。 – Pier

+0

我強烈建議獲得Adobe Scout。它將極大地幫助您試圖監控所有性能,尤其是內存 –

1

你可以使用一個worker,其basicaly後臺線程爲AS3,閱讀起來就可以了這裏ASDocs Worker

+0

我仍然不知道這是正確的答案,但謝謝你的提示。 – Pier

+0

那麼這是你擁有自己的線程的唯一機會。您也可以查看任務框架http://www.spicefactory.org/spicelib/docs/as3/current/manual/task.php – M4tchB0X3r

+0

以下是有關如何在新的Flascc https://使用線程的更多信息github.com/adobe-flash/crossbridge/wiki/Multithreaded-C---programming-with-the-Adobe-Flash-C---Compiler-(FlasCC) – Pier