如何更快地加载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库,但这将需要大量的工作。这是你现在可以测试的