我的画布确实表现得不像我期望的那样。
这是我的问题: 我的两个位图是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 文件夹中。
我想,也许我的图像太大了,我试图对它们进行优化并使它们减小一半,然后性能再次下降。
此外,我的平板电脑的性能更差,但是硬件规格更高,所以这似乎是我加载/缩放图像的方式的问题?
我可以做些什么来获得更好的表现?
提前致谢!
答案 0 :(得分:1)
你正在使用Canvas,如果它是自定义视图的一部分,它可能是硬件加速的,但如果你在Surface上绘图(例如SurfaceView),它永远不会硬件加速。
其颜色格式与底层Surface的颜色格式匹配的位图可以更快地处理,因为不需要格式转换。例如,如果将RGB565位图绘制到ARGB8888曲面上,则必须扩展每个像素。如果Bitmap已经是匹配格式,那么绘制调用可以是一个快速的blit。
平板电脑的显示像素数通常比手机大,但趋势是所有设备类别的像素数都是荒谬的。具有大量像素的显示需要更长时间来绘制,尤其是在使用软件渲染时。单核CPU性能和内存访问速度将比GPU性能更重要。
如果您要渲染到Surface,可以使用SurfaceHolder#setFixedSize()
来减少需要绘制的像素数(demo here,blog post here)。
答案 1 :(得分:0)
您是否在onDraw方法中调用了createScaledBitmap?如果是这样,那就是你放慢速度的原因。你基本上都在旋转所有这些硬件,以便每单帧调整图像大小;正如您所见,随着图像变大,情况会变得更糟。 (一般来说,你应该避免在onDraw中做超重工作,详见Custom Views and Performance) 有几个解决方案:
关于565性能问题:正如Smaller Pixel Formats所述,转换为RGB_565在图像加载后需要额外的计算周期;因此,在图像调整大小的基础上进行此转换时,您会发现速度变慢是有道理的。