【问题标题】:Android Canvas and Hardware Acceleration?Android Canvas 和硬件加速?
【发布时间】:2013-02-09 04:46:39
【问题描述】:

大家好,我想知道是否可以绘制到屏幕外的画布/位图并利用硬件加速,还是我必须在 ViewonDraw() 方法内绘制

例如,我通过执行以下操作绘制到屏幕外位图:

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,它会被硬件加速,但在手机上可能不一样...

【问题讨论】:

    标签: android ondraw hardware-acceleration


    【解决方案1】:

    因为在第一种情况下,您创建了画布,它没有硬件层支持。 此外,到目前为止,您不能只在任何 Canvas 上启用 HWA,它必须属于 HWA 视图。

    另一方面,视图可以访问系统的硬件功能。您可以按照文档中的说明调用setLayerType( LAYER_TYPE_HARDWARE) 来使用它:

    表示视图有一个硬件层。硬件层是 由硬件特定纹理支持(通常是帧缓冲区对象 或 OpenGL 硬件上的 FBO)并导致使用 Android 的硬件渲染管道,但前提是硬件 为视图层次结构打开加速。当硬件 加速已关闭,硬件层的行为与软件完全相同 层。

    此外,性能问题更多地适用于渲染部分,而不是绘图。所有绘制操作都记录为一个图片对象。它是 HWA 发挥重要作用的渲染操作。

    【讨论】:

    • 根据这个答案:stackoverflow.com/a/9950775/935242“SurfaceView.lockCanvas() 返回的画布目前无法进行硬件加速。”
    • TextureView 也一样:stackoverflow.com/a/14987164/935242"TextureView 仅在应用程序硬件加速时工作,但它从 lockCanvas() 返回的 Canvas 目前从未硬件加速......目前,唯一的方法是获得硬件加速的 Canvas 是使用 View 的 onDraw(Canvas) 方法。”
    • @ggurov 已更新。谢谢。
    猜你喜欢
    • 1970-01-01
    • 2016-08-22
    • 2012-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    • 2015-11-29
    相关资源
    最近更新 更多