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

Java 在SurfaceView上加载和显示jpeg的最快方法?,java,android,image,bitmap,bitmapfactory,Java,Android,Image,Bitmap,Bitmapfactory,这是我最后一个问题的后续部分: 现在我可以更快地绘制图像,我面临的问题是图像的实际加载时间太长 在我正在开发的应用程序中,用户可以连续播放视频帧(JPEG),就好像他正在实时观看视频一样。我一直在使用BitmapFactory.decodeFile()将每个jpeg加载到位图中。我无法一次加载所有图像,因为它们大约有240个,这将占用我所有的堆空间。我一直在做的是通过一个单独的线程,一次最多预加载6个到一个数组中,以减少每个图像显示所需的时间 不幸的是,加载一个图像需要50到90毫秒,我需要每隔

这是我最后一个问题的后续部分:

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

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

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


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

我猜您已经尝试了本教程中的所有方法,并选择了最快的方法。也许调整大小可以减少加载时间


最好的当然是如果你根本不需要调整图像的大小。如果你能完全控制这些图像,也许你可以试着把它们打包成精灵,见文章

,我最终的做法与我最初想象的完全不同。这其中有很多,但以下是我如何实现目标的要点:

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

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

    使用内存或使用png而不是jpeg时,你看到了什么不同吗?我还没有尝试过内存,我想我下一步会尝试一下。我开始使用png,但它们比jpeg大得多,而且jpeg在设备上已经占据了大约8MB的空间。使用内部内存似乎要快一点,但对于我正在做的事情来说,它仍然不够快。我认为我真正需要的是一种在不牺牲质量的情况下存储所有图像的方法。如果我将inSampleSize设置为4,我可以将它们全部存储在内存中,但质量会大幅下降。不幸的是,我将不得不调整图像的大小,因为现在许多Android设备可以以高分辨率录制视频,但它们的屏幕尺寸更小。我也不能将图像作为资源引用,因为它们实际上是在运行时从设备上的视频文件生成的。我想我可以在生成图像时调整它们的大小。