2013-03-05 111 views
0

我有一個應用程序從服務器中獲取位圖資源 - 目前我使用Loader類來執行此操作,然後,一旦它們加載,生成一個基於加載程序維度的BitmapData並繪製直接加載到它的實例(BitmapData用於Away3D紋理以及位圖實例,所以我不需要一次提取加載器)。Loader.as返回空白位圖

這一直對我有用,但最近我開始得到0x0加載器,並導致無效的BitmapData。

我停止這樣做:

this.imageBitmap = new BitmapData(this.imageLoader.width, this.imageLoader.height, true, 0); 

..和開始這樣做:

this.imageBitmap = new BitmapData(event.target.content.width, event.target.content.height, true, 0); 

凡活動是由裝載機發射Event.COMPLETE事件。這固定了尺寸問題,但BitmapData只是一個普通的白色位圖(並且默認情況下設置爲透明,因此將其繪製到該位圖中)。令人沮喪的是,這不會每次都發生,如果我刷新它的應用程序,它應該在大約25%的時間內運行,否則它會像這樣起作用。

我有一個緊迫的期限,我真的搞砸了,如果有人可以幫助或建議一個更好的方式做到這一點,你真的會挽救我的脖子!

+0

聽起來像安全相關的問題,我是否從跨域獲取位圖? – LiraNuna 2013-03-05 22:10:32

+0

唉不,我修復了跨域問題,而且它現在是沙箱了(也沒有錯誤,只是空白的Loaders) – MickMalone1983 2013-03-05 22:11:55

+0

http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/ display/Loader.html#contentLoaderInfo – 2013-03-05 22:14:03

回答

0

固定它,一個不起眼的局面愚蠢的監督和一點,但我會離開的情況下,任何人都運行到類似的答案。

我的加載器被包含在一個Asset類中 - 當另一個對象需要內部位圖時,它會查詢這個類 - 如果位圖存在,它會返回它,如果沒有,則用加載器加載並註冊一個完成回調當Loader加載並將其內容傳輸到BitmapData實例時觸發的事件。

我犯的一個愚蠢的錯誤是,如果有多個對象查詢相同(尚未卸載)的資產,它會開始每次重新加載資產,創建一個新的Loader,因爲它是這樣做的...所以當第一個Loader完成時,它會觸發一個事件,但不會引用它,不僅會造成內存泄漏,還會導致Asset類從最近創建的Loader中提取BitmapData,該Loader尚未完成! Loader的異步特性是它有時會起作用的原因,因爲有時最終的Loader會及時準備好BitmapData抽取。

簡單的解決方案是創建一個內部布爾_isLoading,它在第一次調用load()時被設置爲true - 如果它是真的,則任何後續調用都會被忽略,但回調仍然會被註冊,這是一種享受!

0

聽起來像你需要調整加載器的圖像解碼策略 - 以確保它在COMPLETE觸發前解碼圖像 - 然後寬度和高度等應該是可靠的。

要做到這一點,只需添加合適的LoaderContext對象於Loader.load方法:

var loaderContext:LoaderContext = new LoaderContext(); 
//set decode policy 
loaderContext.imageDecodingPolicy = ImageDecodingPolicy.ON_LOAD; 
//load image 
loader.load(yourUrl, loaderContext); 

默認解碼政策ImageDecodingPolicy.ON_DEMAND - 這犯規,直到它實際上是需要進行解碼的圖像。

朗文檔:http://help.adobe.com/en_US/FlashPlatform/reference/actionscript/3/flash/system/ImageDecodingPolicy.html

+0

嘿,我從來沒有聽說過這樣看起來像答案,但可悲的是沒有快樂,同樣的事情發生! – MickMalone1983 2013-03-06 09:10:47