作为概念验证,我们构建了两个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中的硬件加速,我们预计性能会更好,但事实并非如此。我们的假设是错误的还是我们错过了其他的东西?