gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:44:43 26 4
gpt4 key购买 nike

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

我使用 Canvas ,在初始化时加载所有资源,并在需要更新位图时使用 createBitmap。我在 Galaxy Note 3 上使用 ~10-15kb 文件,当我达到大约 20 个位图时,我注意到有一个延迟 (xxhdpi),而在 35 个以上位图时几乎无法使用。

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

到目前为止,我尝试过的唯一发现差异是 inBitmap,它使释放的 GC_FOR_ALLOC 增加了大约 5-10%。

有人愿意提出一个更好的答案吗?我听说 flash AIR 是使用 cacheAsBitmapMatrix 的不错选择,但我想要一个不同的选项(只是个人偏好)。

编辑:

(矩形边界 = 位图边界)

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!

最佳答案

Bitmap 将像素数据存储在 native 堆* 中,而不是 Java 堆中,并自行管理。这意味着 GC 不会给您带来任何严重的头痛。

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

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

编辑:

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

关于java - Android Java - 防止使用大量位图的 GC_FOR_ALLOC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24545120/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com