2013-03-05 120 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