位图被缓存为位图

时间:2013-04-18 00:41:49

标签: actionscript-3 air

我正在使用AIR Mobile for iOS的幻灯片类型部分。用户可以滚动四个页面。每个页面都包含使用Bitmap类和两个TextField加载的PNG(甚至在压缩后大到1MB)。当我滚动它们时(使用自定义滚动框架在整个应用程序中没有任何问题),应用程序将每个PNG图像缓存为位图,因为它们进入屏幕并在它们离开屏幕后卸载它们期间(很可能是下一个GC,尽管它似乎不像GC那样随机)。

在iOS上缓存PNG的行为非常慢,特别是在发生其他动作(例如滚动)的时候。这在滚动时产生约1秒的延迟,这显然是不可接受的。有没有办法要么a)阻止缓存,要么b)让它们更长/无限地缓存,直到图像本身符合GC的条件?

我已经对我的代码进行了三次检查,并且没有将任何内容设置为cacheAsBitmap。此外,我一直在使用Adobe Scout来查明导致瞬间冻结的原因,而且肯定来自缓存图像。我还删除了任何变换或缩放或过滤器或任何可能打开cacheAsBitmap以便操作的结果,结果保持不变。

2 个答案:

答案 0 :(得分:2)

事实证明,位图缓存并不是真正的问题。经过更多的检查,我发现它实际上是PNG减压。基本上,Flash正在解压缩屏幕上的PNG(这比缓存更昂贵),将它们添加到内存中,并在它们离开屏幕一段时间之后撤消该过程,这意味着我将不得不解压缩在每段图像的那段时间之后再次重复。

要解决此问题,您只需要以某种方式访问​​BitmapData对象。我在构造函数中使用了getPixel( 0, 0 ),并且在执行此操作时,图像被解压缩并永久加载到BitmapData中。它会为启动添加一些时间,但以这种方式预加载会带来更好的性能。

答案 1 :(得分:0)

为避免在运行时按需解压缩(按需),您可以请求flash在加载时解压缩。这将增加加载时间但改善应用程序的感知性能,因为单独的线程负责解压缩。这当然意味着当图像到达屏幕时没有抖动或跳过。

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

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

http://www.bytearray.org/?p=2931

嵌入式图像(通过代码)不应该被压缩,因此应用程序不应该出现此问题。但是,如果您和我一样,并且使用Flash Pro IDE导入PNG或其他位图资源,则默认情况下,Flash Pro会使用图像本身提供的设置将它们压缩为JPG。

要解决此问题并避免这些解压缩问题,只需转到Flash Pro资源库,右键单击要更改的图像,单击属性并选择“无损/ PNG / GIF”作为压缩。这将大大增加加载时间,但您将在此处讨论更好的感知性能。除了实现上面的代码之外,还应该这样做,否则它将没有任何区别。

根据我的经验,帧速率平均每秒仅下降一帧,但它更加一致,没有任何跳跃或滞后对游戏至关重要。

由于Flash Player将释放BitmapData的解压缩位图内存,因此如果在此之后仍然发生解压缩,这是一个解决方案:Keeping Bitmaps Decompressed