加载位图的最快方法,一旦创建就重新使用位图

时间:2012-03-12 14:59:22

标签: android bitmap java-native-interface

我有一个应用程序,我生成许多Bitmap对象。创建位图后,所有剩余的位图都将具有相同的大小。

目前我可以在手机上大约50-80毫秒内加载/创建一个新的位图,这可以满足我的需要。然而,由于快速创建这些,我正在不断GC。

我想重新使用相同的位图对象,但我不确定如何通过sdk执行此操作。

我编译了libjpeg并通过NDK加载我的图像并重新使用我的位图,但是我的加载速度下降到大约200毫秒,这太慢了。 我以后会在我面前发布代码。

问题:

有没有办法重新使用我的位图对象来避免GC? 有没有更快的方式通过NDK加载我的图像?是否有可能挂钩操作系统加载位图的方式?我知道libjpegTurbo,但我目前无法编译它(另一天的另一个主题)。

关于最佳方法的任何其他想法。

2 个答案:

答案 0 :(得分:1)

为什么不使用hashmap存储位图?然后在加载位图时,首先检查它是否在hashmap中,如果是,则可以重用它。如果它不在hashmap中,请正常保存,然后将其插入hashmap。

答案 1 :(得分:1)

我建议使用包含您需要换出的像素数据的IntBuffer。然后,创建一个所需大小的位图,当需要换出像素时,使用bitmap.copyPixelsFromBuffer()。我想这会比每次需要更改像素数据时分配/解除分配位图内存快得多。如果要将缓冲区保留在内存中以便快速检索,最好将缓冲区保留在hashmap中。

可选地,您可以将setPixels()与int数组一起使用。 copyPixelsFromBuffer()的好处在于没有尝试像素转换,并且选项较少,因此可能会快一些。