安卓画布和硬件加速?

7

大家好,我想知道是否可以绘制到一个离屏画布/位图,并利用硬件加速,还是必须在View的onDraw()方法中绘制。

例如,我通过以下方式绘制到离屏位图:

Bitmap.Config config = Bitmap.Config.ARGB_8888;
Bitmap buffer = Bitmap.createBitmap(200, 200, config);
Canvas canvas = new Canvas(buffer);
Paint paint = new Paint();
paint.setColor(Color.RED);
canvas.drawLine(0, 0, 100, 100, paint);

然而,canvas.isHardwareAccelerated() 返回 false,并且与以下情况相比绘图较为缓慢:
protected void onDraw(Canvas canvas) {

    Paint paint = new Paint();
    paint.setColor(Color.RED);

    canvas.drawLine(0, 0, 100, 100, paint);
}

canvas.isHardwareAccelerated()返回true的情况下,有没有一种方法可以利用硬件加速绘制到位图上?或者我必须直接在onDraw方法中绘制到屏幕上吗?
谢谢你的帮助 :) 我知道在Java中,我可以绘制到一个离屏的BufferedImage上,并且它会被硬件加速,但也许在手机上不是这样的。
1个回答

4
由于在第一种情况下,你创建的画布并没有由硬件层支持。此外,目前你不能在任何画布上启用HWA,它必须属于一个HWA视图。
另一方面,视图具有访问系统硬件功能的权限。你可以通过调用setLayerType(LAYER_TYPE_HARDWARE)来实现,如文档所述:
表示该视图具有硬件层。硬件层由硬件特定的纹理(通常是OpenGL硬件上的Frame Buffer Objects或FBO)支持,并使视图使用Android的硬件渲染管道进行渲染,但仅在为视图层级启用硬件加速时才会发生。当关闭硬件加速时,硬件层的行为与软件层完全相同。
此外,性能问题更多地应用于渲染部分,而不是绘制部分。所有绘制操作都被记录为Picture对象。其中HWA在渲染操作中扮演重要角色。

3
根据这个回答:https://dev59.com/zGkw5IYBdhLWcg3w4eYD#9950775 "SurfaceView.lockCanvas() 返回的 Canvas 目前无法进行硬件加速。" - ggurov
4
同样适用于TextureView: https://dev59.com/Wmkw5IYBdhLWcg3wVpFi#14987164 "只有当应用程序启用硬件加速时,TextureView 才能工作,但是它从 lockCanvas() 返回的 Canvas 目前永远不会启用硬件加速...目前,获取启用硬件加速的 Canvas 的唯一方法是使用 View 的 onDraw(Canvas) 方法。" - ggurov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接