Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Java-防止带有大量位图的GC_FOR_ALLOC_Java_Android_Bitmap - Fatal编程技术网

Android Java-防止带有大量位图的GC_FOR_ALLOC

Android Java-防止带有大量位图的GC_FOR_ALLOC,java,android,bitmap,Java,Android,Bitmap,我想知道在使用大量在屏幕上绘制的位图时,是否有任何优化可以用来提高速度 我使用画布,在初始化时加载所有资源,并在需要更新位图时使用createBitmap。我在Galaxy Note 3中使用了约10-15kb的文件,当我达到大约20个位图时,会发现一个延迟xxhdpi,大约35+左右几乎无法使用 我经常使用createbitmap,因为位图使用帧动画和矩阵来旋转 到目前为止,我试过的唯一一件事是,我注意到了一个不同点,就是inBitmap,它使释放的所有变量的GC增加了5-10% 有谁愿意插嘴

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

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

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

到目前为止,我试过的唯一一件事是,我注意到了一个不同点,就是inBitmap,它使释放的所有变量的GC增加了5-10%

有谁愿意插嘴说一个好的答案,哪一个更好?我听说FlashAir是使用cacheAsBitmapMatrix的一个不错的选择,但我希望有一个不同的选择,只是个人首选

编辑:

rectf边界=位图边界

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代替。我会试试的,谢谢你,梅米特

位图将像素数据存储在本机堆*,而不是java堆中,并自行管理。这意味着GC不会给你带来任何严重的头痛

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

相反,我建议您将矩阵与画布结合使用。只需更改矩阵,并在每一步使用它重新绘制位图

编辑:


*仅适用于Android 2.3.3 Android 3.0

您是否愿意进一步解释?我旋转一个矩阵,然后用矩阵创建位图。什么是重新粉刷?我在底部进行了编辑,以显示我使用的一些代码我想我理解,我使用的是自定义绘图视图,因此我可以使用canvas.drawBitMapBitBitmap、matrix、paint;但是当我同时调用canvas.drawBitmapbitmap、srcRectf、dstRectf、paint;,我怎么能调用它呢;?没错,我相信矩阵也可以缩放和修剪。看一看,因为我对android的矩阵不是很熟悉。不客气,我没听清你的问题。您所说的实例或新资源是什么意思?如果新资源意味着您没有以某种方式将其加载到内存中,那么您应该调用createBitmap。很抱歉,删除它之前,我应该考虑一下:P-在我的代码中,我使用createBitmap初始化每个位图一次,并将它们放入数组中,以便可以重用它们。现在有你的指导,让我陷入了“我现在需要尽可能多的要求”的模式。哈哈!