画布:性能不佳和奇怪的行为?

时间:2015-09-07 17:12:39

标签: android performance bitmap android-canvas

我的画布确实表现得不像我期望的那样。

这是我的问题: 我的两个位图是700kb和1.4mb。

这里我加载了我的位图

mBitmap = BitmapFactory.decodeResource(mContext.getResources(),
            drawable, mOptions);

之后,我将其重新调整到我需要它的大小:

mBitmap = Bitmap.createScaledBitmap(mBitmap, width, height, false);

然后我画它:

canvas.drawBitmap(mBitmap, x, y, myPaint); 

整体表现非常糟糕,我不确定为什么?

这是奇怪的行为: 当我加载低质量的位图( RGB_565 )时,我会遇到 12(?!)FPS 并且它实际上很迟钝。当我以更高的质量( ARGB_8888 )加载它们时,我得到 25 FPS (仍然太少)。

在我的清单中我设置了android:hardwareAccelerated =" true",但这也没有任何区别,CPU使用率始终是相同的。

图像放在 drawable-nodpi 文件夹中。

我想,也许我的图像太大了,我试图对它们进行优化并使它们减小一半,然后性能再次下降。

此外,我的平板电脑的性能更差,但是硬件规格更高,所以这似乎是我加载/缩放图像的方式的问题?

我可以做些什么来获得更好的表现?

提前致谢!

2 个答案:

答案 0 :(得分:1)

你正在使用Canvas,如果它是自定义视图的一部分,它可能是硬件加速的,但如果你在Surface上绘图(例如SurfaceView),它永远不会硬件加速。

其颜色格式与底层Surface的颜色格式匹配的位图可以更快地处理,因为不需要格式转换。例如,如果将RGB565位图绘制到ARGB8888曲面上,则必须扩展每个像素。如果Bitmap已经是匹配格式,那么绘制调用可以是一个快速的blit。

平板电脑的显示像素数通常比手机大,但趋势是所有设备类别的像素数都是荒谬的。具有大量像素的显示需要更长时间来绘制,尤其是在使用软件渲染时。单核CPU性能和内存访问速度将比GPU性能更重要。

如果您要渲染到Surface,可以使用SurfaceHolder#setFixedSize()来减少需要绘制的像素数(demo hereblog post here)。

答案 1 :(得分:0)

您是否在onDraw方法中调用了createScaledBitmap?如果是这样,那就是你放慢速度的原因。你基本上都在旋转所有这些硬件,以便每单帧调整图像大小;正如您所见,随着图像变大,情况会变得更糟。 (一般来说,你应该避免在onDraw中做超重工作,详见Custom Views and Performance) 有几个解决方案:

  1. 在图像初始加载期间调整图像大小一次,并将调整大小的图像保留在内存中以便在onDraw方法中使用
  2. 使用cavnas缩放(更新绘图矩阵以绘制较小的图像)。您将传入较大的图像进行绘制,GPU将为您处理缩放,而不是您必须手动完成。
  3. 关于565性能问题:正如Smaller Pixel Formats所述,转换为RGB_565在图像加载后需要额外的计算周期;因此,在图像调整大小的基础上进行此转换时,您会发现速度变慢是有道理的。