0

我有一个应用程序从服务器中提取 Bitmap 资源 - 目前我使用 Loader 类来执行此操作,然后,一旦加载它们,根据加载器尺寸生成 BitmapData 并将 Loader 的实例直接绘制到它( BitmapData 用于 Away3D 纹理以及 Bitmap 实例,所以我不需要加载器一次获取)。

这一直对我有用,但最近我开始得到 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 是加载程序触发的 Event.COMPLETE 事件。这解决了尺寸问题,但 BitmapData 只是一个纯白色位图(默认情况下它设置为透明,所以它被绘制到其中)。令人沮丧的是,这并不是每次都会发生,如果我刷新应用程序,它应该在大约 25% 的时间里正常工作,否则它会像这样播放。

我的截止日期很紧,我真的在搞砸这件事,如果有人可以提供帮助或建议更好的方法,你真的会拯救我的脖子!

4

2 回答 2

0

听起来您需要调整加载程序的图像解码策略 - 以确保它在 COMPLETE 触发之前解码图像 - 然后宽度和高度等应该是可靠的。

为此,只需在 Loader.load 方法中添加一个合适的 LoaderContext 对象:

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

于 2013-03-06T01:04:10.570 回答
0

修复了它,愚蠢的疏忽和有点模糊的情况,但我会留下答案,以防有人遇到类似的事情。

我的加载器包含在 Asset 类中 - 当另一个对象需要内部位图时,它会查询此类 - 如果位图存在,则返回它,如果不存在,则使用加载器加载它并为触发的 COMPLETE 事件注册回调当 Loader 已加载并将其内容传输到 BitmapData 实例时。

我犯的愚蠢错误是,如果多个对象正在查询同一个(尚未加载的)资产,它每次都会开始重新加载资产,并创建一个新的加载器......所以当第一个加载器已完成,它会触发一个事件但不存在对它的引用,这不仅会造成内存泄漏,还会导致资产类从最近创建的加载器中提取 BitmapData,这并不完整!Loader 的异步特性是它有时工作的原因,因为有时最终的 Loader 会及时准备好进行 BitmapData 提取。

简单的解决方案是创建一个内部布尔值 _isLoading,它在第一次调用 load() 时设置为 true - 如果它为 true,则任何后续调用都将被忽略,但回调仍然注册,这是一种享受!

于 2013-03-14T10:25:48.883 回答