【问题标题】:AS3 async Bitmap creation iOSAS3 异步位图创建 iOS
【发布时间】:2013-06-26 19:08:49
【问题描述】:

我正在使用 Adob​​e Air 开发一个 iPad 应用程序。

当应用程序启动时,我已将所有图像加载到 BitmapData 对象中。然后我只需要创建Bitmap 对象(它们只是容器)来使用存储在BitmapDataobjects 中的像素。

这工作正常,直到我必须创建一个带有大图像的Bitmap 对象。应用程序速度变慢,甚至冻结长达 1 秒。

由于 AS3 是单线程的,我无法将 Bitmap 创建委托给新线程。此外,如果 UI 被冻结,我无法显示一个像样的微调器来通知用户“发生了什么事”。

我该如何解决这个问题? 有没有办法在不影响 UI 性能的情况下并行创建对象?

【问题讨论】:

    标签: ios actionscript-3 air


    【解决方案1】:

    您可以使用 worker,它基本上是 as3 的后台线程,请在此处阅读 ASDocs Worker

    【讨论】:

    【解决方案2】:

    嗯,答案似乎要简单得多,而且 Adob​​e 已经想到了这一点。

    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);
    

    【讨论】:

    • 更常见(尽管不正确)的方法是在您希望加载到内存中的 BitmapData 上简单地调用 BitmapData.getPixel(0,0)。这将解码数据以获取像素(并且也适用于嵌入式图像)。请注意,解码图像会将 未压缩 图像加载到内存中。由于您可以在 iOS 中使用的 RAM 量很少,而且运行时有多大,这很快就会成为一个问题。
    • 谢谢@JoshJanusch 我会留意记忆。到目前为止,上述解决方案运行良好。
    • 我强烈建议使用 Adob​​e Scout。在尝试监控所有性能(尤其是内存)时,它将极大地帮助您
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 2011-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多