为什么硬件加速View Canvas比Android中的SurfaceView Canvas慢?

时间:2017-07-09 02:49:48

标签: android canvas surfaceview hardware-acceleration

作为概念验证,我们构建了两个Android应用程序,在画布上绘制4000个圆圈,每帧移动1个像素。

第一个,使用SurfaceView并调用holder.lockCanvas()来获取画布并更新它。

while (isRunning) {
    startTime = System.nanoTime();
    Canvas canvas = null;
    try {
        canvas = surfaceHolder.lockCanvas();

        if (canvas != null)
        {
            synchronized(surfaceHolder) {
                gamePanel.update();
                gamePanel.draw(canvas);
            }
        }
    } catch(Exception e) {
        e.printStackTrace();
    } finally {
        if (canvas != null)
            try {
                surfaceHolder.unlockCanvasAndPost(canvas);
            } catch (Exception e) {
                e.printStackTrace();
            }
    }
}

另一个应用程序覆盖View并使用onDraw(canvas)方法更新场景。

public class CustomView extends View {
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);

        ballGroup.draw(canvas);
        invalidate();
    }
}

圆圈绘制在对象ballGroup内,对象具有每个圆圈的坐标数组。

for (Ball ball : balls) {
    canvas.drawCircle(ball.x, ball.y, ball.radius, ball.paint);
}

正如Android文档中所述,自定义View的画布是硬件加速而SurfaceView Canvas不是。但是,实验结果表明使用SurfaceView时帧率更高。

我们知道视图的画布在UI线程上运行,而SurfaceView在单独的线程上运行。尽管如此,由于Custom View Canvas中的硬件加速,我们预计性能会更好,但事实并非如此。我们的假设是错误的还是我们错过了其他的东西?

0 个答案:

没有答案