如何更快地加载Android位图?

如何更快地加载Android位图?,android,bitmap,android-bitmap,bitmapfactory,Android,Bitmap,Android Bitmap,Bitmapfactory,我正在创建一个应用程序,它需要显示视频帧的一系列位图。该应用程序使用MediaCodec将视频解码为多个帧,并获取每个帧的位图s以在ImageView上显示它们 问题是,每个位图的大小约为2~3MB(帧大小为1280 x 720,即720p视频的大小)。因此,当位图的数量超过60~65时,应用程序会因内存不足而崩溃。为了避免这个问题,我一直在实现D-tour算法,它只加载需要立即或很快显示的位图。基本上我一直在尝试这些方法 1.提前加载所有位图。 它的速度足够快,可以满足我的需要,但正如前面提到

我正在创建一个应用程序,它需要显示视频帧的一系列位图。该应用程序使用
MediaCodec
将视频解码为多个帧,并获取每个帧的
位图
s以在
ImageView
上显示它们

问题是,每个
位图的大小约为2~3MB(帧大小为1280 x 720,即720p视频的大小)。因此,当位图的数量超过60~65时,应用程序会因内存不足而崩溃。为了避免这个问题,我一直在实现D-tour算法,它只加载需要立即或很快显示的
位图。基本上我一直在尝试这些方法

1.提前加载所有位图。 它的速度足够快,可以满足我的需要,但正如前面提到的,当
位图的数量超过60~65时,应用程序就会崩溃

2.提取帧时,将每个帧保存到
JPEG
文件中,并在需要时将特定的
JPEG
s加载到
位图
s中。 我曾经从
JPEG
加载
Bitmap
,但速度很慢

3.提取帧时,将整个帧保存到文件中,并在需要时将特定的“帧”(技术上是字节数组)加载到
位图中。
我想如果我从字节数组本身加载
位图
,性能可能会更好。因此,在提取帧时,我创建了另一个元数据文件,其中包含每个帧的字节索引信息,并在需要时使用该信息加载
Bitmap
s。使用[
BitmapFactory.decodeByteArray
](,int,int))。我可以看到速度略有提高,但仍然不够


在这种情况下,我还可以尝试增强位图的加载吗?

您有一些选择,您的缓存想法很聪明。在我的脑海中,有几件事可以尝试:

  • 关注为什么你的图像如此之大。这种分辨率的图像应该能够压缩到小于2-3 MB的大小,如果可以将数据编码为更压缩的图像格式,它将大大减少应用程序的内存占用,并加快加载速度
  • 如果不总是需要全分辨率照片,您可以尝试按需调整其大小,然后,如果需要全分辨率照片,您可以加载该照片
  • 在后台加载图像,这样当用户需要它们时,它们已经在那里了。这可以通过扩展适配器并在异步任务中加载映像来实现。谷歌的例子中有一个很好的例子:

对于您的算法,一些库(如和)可以为您处理该问题。至于编码/解码速度,JPEG可能是快速将位图刷新到磁盘上的最佳选择,因为文件大小很小,并且可以由计算机支持

有些东西你可以试试

  • 如果您可以控制位图的生成方式,请使用RGB565以减少内存消耗(最多减少50%的内存,因为argb888是32位的,而RGB565是16位的)
  • 创建一个较小的图像,然后稍后将其放大
  • 添加
    android:largeHeap=true
    到清单中,这样您就可以使用内存了
  • 位图的LRU缓存,这也已在中实现
  • 如果您愿意,可以根据您的特定需要手动编译jpeg库,但这将需要大量的工作。这是你现在可以测试的