防止从RAM中卸载位图

时间:2012-12-19 22:11:04

标签: actionscript-3 actionscript air

我在AIR项目中有2个大位图,并希望将其可见性快速切换到用户(同时只显示一个位图)。

我尝试在应用程序启动时加载两个位图并将它们保存在内存中,这样我就可以显示第一个并隐藏第二个(反之亦然)。

但默认情况下,平台会在30秒后卸载隐藏的位图:http://help.adobe.com/en_US/as3/mobile/WS4bebcd66a74275c3-576ba64d124318d7189-7ff8.html

此行为导致延迟再次将先前卸载的位图加载到RAM中。这需要大约10秒,这太长了。

我该如何解决?

2 个答案:

答案 0 :(得分:2)

首先,你很幸运Bitmap甚至会加载。每the LiveDocs

  

在AIR 1.5和Flash Player 10中,BitmapData对象的最大大小为宽度或高度为8,191像素,总像素数不能超过16,777,215像素。 (因此,如果BitmapData对象的宽度为8,191像素,则其高度仅为2,048像素。)在Flash Player 9及更早版本以及AIR 1.1及更早版本中,限制为高度为2,880像素,宽度为2,880像素。

无论如何,为什么不保存Bitmap而不是保存BitmapData本身?然后,每次要使图像可见时,只需使用BitmapData创建一个新的位图。

如果它也有截止(不明白为什么会这样),你可以尝试使用输出BitmapData.getPixels()的{​​{1}}。每次需要加载位图时,都会执行ByteArray,然后将BitmapData添加到新的Bitmap对象中。

警告:最后一种方法会很慢,很慢。

无论如何,您应该考虑减小图像的大小或查看图块系统。有关Bing Maps图块系统的信息,请参阅this article,了解该怎么做(无论应用程序如何,这都是一篇很好的,精心编写的文章)。这显然要比你需要的复杂得多,但256x256(Bing和谷歌都使用)是一个很好的尺寸来平铺大图像。它足够小,可以快速按需加载,以便在视口外部时可以让它们消失(舞台上的BitmapData.setPixels( ByteArray )越多,它运行得越慢)

答案 1 :(得分:0)

我们的项目遇到了类似的问题。我们发现如果位图在最后10秒内没有在屏幕上呈现,AIR将摆脱加载的位图的未压缩图像数据。运行时保留压缩的PNG或JPG数据,因此可以在下次需要渲染时根据需要重新解压缩图像。这会导致我们的应用程序出现相当大的延迟,因为它必须解压缩大图像。

我们的修复涉及永远不会从舞台上移除任何图像(需要稍后快速显示):当应该删除图像时,请在舞台顶部将其设置为alpha 0.001。它不会在屏幕上显示,但Flash仍然需要渲染它。这个修复听起来像渲染性能会很糟糕,但我们实际上并没有发现任何差异与几乎透明的"在舞台上闲逛的位图。

尽管有这个问题,但是你可能会遇到一些问题:如果屏幕上没有任何变化,运行时甚至无法进行渲染过程。如果在一段延长的时间内(大约10秒)没有任何渲染,Flash将再次开始丢弃不需要的位图,即使它们在舞台上可见。我们使用另一种方法强制Flash继续渲染:

  1. 创建一个小矩形,alpha设置为0.001。将它添加到舞台的顶层。
  2. 创建一个延迟1秒的计时器,永远重复。
  3. 每次定时器触发时,将矩形移动到舞台上的随机位置。
  4. 这将强制Flash执行渲染通道,至少每秒一次。

    注意:在AIR 3(和Flash Player 11)中完全删除了位图大小的限制。所以今天,如果您的图像可以放入RAM,您可以加载它!