在SurfaceView上加载和显示jpeg的最快方法?

时间:2011-06-29 19:56:41

标签: java android image bitmap bitmapfactory

这是我上一期提问的后续内容:Canvas is drawing too slowly

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

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

不幸的是,加载图像需要50到90毫秒,我需要每隔42毫秒显示一个图像。是否有更快的方式加载图像?

为了澄清,这些图像位于SD卡上的文件夹中,它们都是720x480 jpeg。我将它们的样本减半,以减少内存使用量。

2 个答案:

答案 0 :(得分:1)

我最终做的与我原先设想的完全不同。它有很多,但这是我实现目标的要点:

  1. 所有图像都存储在SD卡上并写入一个文件(每个图像占用文件中的X个字节)
  2. 使用本机代码读取和写入图像文件
  3. 在请求图像时,我使用JNI包装器将列表中的图像索引和位图对象(RGB_565)传递给本机代码
  4. 本机代码锁定位图表面,将像素数据(作为uint8_t **)直接写入位图,然后将其解锁
  5. 图像呈现在屏幕上
  6. 通过这种方式,我只需要一次在内存中存储一​​个图像,并且我能够绕过垃圾收集(因为位图只创建一次,然后本地重新填充)。我希望其他人可能会发现这个策略很有用。

答案 1 :(得分:0)

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

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