3

这是我最后一个问题的后续:Canvas is drawing too slow

现在我可以更快地绘制图像,我面临的问题是图像的实际加载时间太长了。

在我正在开发的应用程序中,用户能够连续播放视频帧(jpeg),就好像他正在实时观看视频一样。我一直在使用BitmapFactory.decodeFile()将每个 jpeg 加载到位图中。我无法一次加载所有图像,因为大约有 240 张图像,这会占用我所有的堆空间。我一直在做的是通过单独的线程一次将最多 6 个预加载到一个数组中,以减少每个图像显示所需的时间。

不幸的是,加载一张图片需要 50 到 90 毫秒,而且我需要每 42 毫秒显示一张图片。有没有更快的方法来加载图像?

为澄清起见,这些图像位于 SD 卡上的一个文件夹中,它们都是 720x480 的 jpeg。我以一半大小对它们进行采样以减少内存使用量。

4

2 回答 2

1

我最终做了这与我最初设想的完全不同的事情。它有很多内容,但这是我如何实现目标的要点:

  1. 所有图像都存储在 SD 卡上并写入一个文件(每个图像占用文件中的 X 个字节)
  2. 使用本机代码读取和写入图像文件
  3. 请求图像时,我使用 JNI 包装器将列表中图像的索引和位图对象 (RGB_565) 传递给本机代码
  4. 本机代码锁定位图表面,将像素数据(作为 uint8_t**)直接写入位图,然后将其解锁
  5. 图像被渲染到屏幕上

通过这样做,我一次只需要在内存中存储一​​个图像,并且我能够绕过垃圾收集(因为位图只创建一次,然后在本地重新填充)。我希望其他人可能会发现这个策略很有用。

于 2011-10-11T01:53:01.530 回答
0

猜猜你已经尝试了本教程http://www.higherpass.com/Android/Tutorials/Working-With-Images-In-Android/2/中的所有方法并选择了最快的。也许调整大小可以减少加载时间。

最好的当然是您根本不必调整图像大小。如果您可以完全控制图像,也许您可​​以尝试将它们打包为精灵,请参阅文章http://www.droidnova.com/2d-sprite-animation-in-android,471.html

于 2011-06-29T20:25:49.857 回答