【问题标题】:How to load Android Bitmap faster?如何更快地加载 Android 位图?
【发布时间】:2015-10-25 00:52:09
【问题描述】:

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

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

1。提前加载所有Bitmaps。

它的速度足以满足我的需要,但正如提到的,当Bitmaps 的数量超过 60~65 时,应用程序会崩溃。

2。提取帧时,将每个帧保存到JPEG 文件中,并在需要时将特定的JPEGs 加载到Bitmaps 中。

我使用BitmapFactory.decodeFileJPEG 加载Bitmap,但速度很慢。

3。提取帧时,将整个帧保存到 MJPEG 文件中,并在需要时将特定“帧”(技术上是字节数组)加载到 Bitmaps 中。

我想如果我从字节数组本身加载Bitmap,性能可能会更好。因此,在提取帧时,我创建了另一个元数据文件,其中包含每个帧的字节索引信息,并在需要时使用该信息加载Bitmaps。 [BitmapFactory.decodeByteArray](http://developer.android.com/reference/android/graphics/BitmapFactory.html#decodeByteArray(byte[], int, int)) 被使用。我可以看到速度略有提高,但仍然不够。

在这种情况下,我还能尝试提高Bitmap 的加载速度吗?

【问题讨论】:

    标签: android bitmap android-bitmap bitmapfactory


    【解决方案1】:

    你有几个选择,你的缓存想法很聪明。在我的脑海中,这里有一些事情可以尝试:

    • 关注您的图像为何如此之大。该分辨率的图像应该能够被压缩到小于 2 - 3 MB,如果可以将数据编码为更压缩的图像格式,它将大大减少您的应用程序的内存占用并导致更快的加载时间
    • 如果并非总是需要全分辨率照片,您可以尝试按需调整其大小,然后如果需要全分辨率照片,您可以加载它
    • 在后台加载图像,以便在用户需要时它们已经存在。这可以通过扩展适配器和在异步任务中加载图像来实现。谷歌示例中有一个很好的例子: http://developer.android.com/training/displaying-bitmaps/process-bitmap.html

    【讨论】:

      【解决方案2】:

      对于您的算法,GlidePicasso 等一些库可以为您处理。至于编码/解码速度,JPEG 可能是您快速将位图刷新到磁盘的最佳选择,因为文件很小并且可以由hardware 支持。

      你可以尝试一些事情

      1. 如果您可以控制位图的生成方式,请使用 RGB565 来减少内存消耗(最多减少 50% 的内存,因为 ARGB8888 是 32 位,而 RGB565 是 16 位)
      2. 创建一个较小的图像,然后将其放大
      3. android:largeHeap=true 添加到清单中,以便您有内存可以使用
      4. 位图的 LRU 缓存,这已在 Picasso's caching 中实现

      如果您愿意,可以手动编译您的 jpeg 库以满足您的特定需求,但这需要非常重要的工作。这是something,您可以立即测试。

      【讨论】:

        猜你喜欢
        • 2021-08-29
        • 2014-11-26
        • 1970-01-01
        • 1970-01-01
        • 2012-12-02
        • 2019-09-04
        • 1970-01-01
        • 2012-03-08
        • 1970-01-01
        相关资源
        最近更新 更多