Android Java - 使用大量位图防止GC_FOR_ALLOC

时间:2014-07-03 04:45:59

标签: java android bitmap

我想知道在屏幕上使用大量位图时是否有任何可用于提高速度的优化。

我使用画布,我在初始化时加载了所有资源,并在需要更新位图时使用createBitmap。我使用我的Galaxy Note 3使用~10-15kb文件,并且当我达到大约20位图时会发现滞后(xxhdpi),这在35 +左右几乎无法使用。

我经常使用createbitmap,因为位图使用帧动画和矩阵来旋转。

到目前为止,我尝试过的唯一一件事就是我发现了一个区别是inBitmap,它释放了GC_FOR_ALLOC大约5-10%的增加。

任何人都愿意为更好的答案提供一个好的答案吗?我听说过flash AIR是使用cacheAsBitmapMatrix的好选择,但我想要一个不同的选项(只是个人pref)。

编辑:

(rectf bounds =位图界限)

matrix.setRotate(rotation, rectf.centerX(), rectf.centerY());
ship1 = Bitmap.createBitmap(ship1, 0, 0, ship1.getWidth(), ship1.getHeight(), matrix, true);

我想我理解我的问题,我应该致电

canvas.drawBitmap(ship1, matrix, paint);

但在我的onDraw方法中,我正在使用

canvas.drawBitmap(ship1, srcRectf, dstRectf, paint); //srcRectf = null

我使用dstRectf移动我的位图,但我想这可以用setTranslate替换。我会尝试一下,谢谢Mehmet!

1 个答案:

答案 0 :(得分:0)

位图将像素数据存储在本机堆*中,而不是存储在Java堆中,并负责自行管理。这意味着GC不应该给你带来任何严重的麻烦。

问题可能是经常使用createBitmap(),这通常是一项非常昂贵的操作。这将使磁盘IO调用最坏,或者最好是相对较大的内存分配。您希望尽可能少地使用它,即仅在最初从磁盘读取它们时才使用它。

相反,我建议您将MatrixCanvas结合使用。只需更改Matrix,然后每一步都用它重新绘制Bitmap

编辑:

*仅适用于Android 2.3.3< - > Android 3.0