0

我在 AIR 项目中有 2 个大位图,想快速将它们的可见性切换给用户(同时只显示一个位图)。

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

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

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

我该如何解决?

4

2 回答 2

2

首先,你很幸运Bitmap会加载。根据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()which outputs a ByteArray. 每次您需要加载 Bitmap 时,您执行 aBitmapData.setPixels( ByteArray )然后将 BitmapData 添加到新的 Bitmap 对象。

请注意:最后一种方法会很慢,非常慢。

无论如何,您可能应该考虑减小图像的大小或查看平铺系统。请参阅这篇关于 Bing 地图磁贴系统的文章,了解在那里做什么(这是一篇很棒的、很好的文章,无论应用程序如何)。这显然比您需要的要复杂得多,但 256x256(必应和 Google 都使用)是平铺大图像的好尺寸。它足够小,可以快速按需加载,这样您就可以让它们在视口之外消失(DisplayObject舞台上的 s 越多,运行速度越慢)

于 2012-12-20T00:30:07.637 回答
0

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

我们的修复包括从不从舞台上移除任何图像(需要稍后快速显示):当应该移除图像时,将其设置为舞台顶部的 alpha 0.001。它不会在屏幕上显示,但 Flash 仍然必须渲染它。这个修复听起来对渲染性能来说很糟糕,但我们实际上并没有注意到舞台上悬挂的“几乎透明”位图有任何区别。

尽管进行了此修复,但您可能会遇到一些问题:如果屏幕上没有任何变化,则运行时甚至不会费心进行渲染传递。如果长时间(大约 10 秒)没有渲染,Flash 将再次开始丢弃不需要的位图,即使它们在舞台上可见。我们使用了另一种技术来强制 Flash 继续渲染:

  1. 创建一个小矩形,alpha 设置为 0.001。将其添加到舞台的顶层。
  2. 创建一个有 1 秒延迟的计时器,永远重复。
  3. 每次触发定时器时,将矩形移动到舞台上的随机位置。

这将强制 Flash 至少每秒执行一次渲染过程。

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

于 2015-01-21T15:02:20.463 回答