2

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

在 iOS 上缓存 PNG 的动作非常慢,尤其是当它发生在另一个动作(例如滚动)发生时。这会在滚动时产生约 1 秒的延迟,这显然是不可接受的。有没有办法a)防止缓存或b)将它们缓存更长时间/无限期直到图像本身有资格进行GC?

我已经三重检查了我的代码,没有任何内容设置为 cacheAsBitmap。此外,我一直在使用 Adob​​e Scout 来查明导致瞬间冻结的原因,这肯定是由于缓存图像。我还消除了任何转换或缩放或过滤器或任何可能打开 cacheAsBitmap 以进行操作的东西,结果保持不变。

4

2 回答 2

2

事实证明,位图缓存毕竟不是真正的问题。查了很多,才发现原来是PNG解压。基本上,Flash 在 PNG 出现在屏幕上时对其进行解压缩(这比缓存更昂贵),将它们添加到内存中,并在它们离开屏幕一段时间后撤消该过程,这意味着我必须解压缩在每张图像的那段时间之后重新开始。

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

于 2013-04-22T17:14:49.770 回答
0

为避免在运行时(按需)解压缩,您可以请求闪存在加载时对其进行解压缩。这将增加加载时间,但会提高应用程序的感知性能,因为一个单独的线程负责解压缩。这当然意味着图像在屏幕上时不会出现抖动或跳过。

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 的解压缩位图内存,如果在此之后仍然发生解压缩,这里有一个解决方案:保持位图解压缩

于 2014-10-07T07:07:01.153 回答