我编写了代码来从给定的字节数组创建位图。以下是示例代码:
Bitmap bm = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(imgData));
然而,它需要大约15-20毫秒。同样,可能还有其他操作可能会占用Android应用程序中的时间。在adb logcat中,我看到GC_ALLOC_FREE ....暂停了14ms,堆大小增加等等。
我的问题:有没有办法在Android应用程序中预先分配内存,这样可以避免GC被调用这么多次?我在网上搜索,我知道通常游戏应用程序会进行性能优化,但是,找不到如何做的例子。
编辑: 根据以下建议,我将'bm'作为成员变量并创建ByteBuffer对象。
Bitmap bm = bm.createBitmap(width, height, Bitmap.Config.ARGB_8888);
ByteBuffer bb = ByteBuffer.allocate(<length>);
然后一遍又一遍地调用下面的代码:
bitmap.copyPixelFromBuffer(bb.put(data));
然而,它给了我相同的结果,我仍然看到GC_FOR_ALLOC被释放...暂停了15毫秒。
此外,上述代码行在侦听器方法中被调用,它将“数据”作为参数获取。
答案 0 :(得分:0)
编辑后的代码实际上是正确的,但是,我在代码的其他部分生成了一些字节数组,这使得GC工作变得很困难。
@CommansWare:你的回答指出了我正确的方向。感谢。
答案 1 :(得分:-1)
为什么不使用BitmapFactory.decodeByteArray
创建位图?然后它会为您自动完成所有操作。您还可以查看该方法的扩展版本,该版本允许您提前设置宽度和高度(以及其他参数)。