(1)
很多人对SurfaceView的双缓冲理解并不对。
一般游戏里说的双缓冲防止画面闪烁,只是每一帧先绘制到bitmap再绘制到SurfaceView的canvas。
而框架中的Surface的双缓冲是另一个概念。 事实上不管是View还是SurfaceView都会使用到Surface双缓冲技术,在4.1以后更是引入了三缓冲。
楼主看到的画面实际上就是Surface的三缓冲造成的。使用SurfaceView每次lockCanvas获取到的画布都是1,2,3个画布轮流切换。
一般游戏里说的双缓冲防止画面闪烁,只是每一帧先绘制到bitmap再绘制到SurfaceView的canvas。
而框架中的Surface的双缓冲是另一个概念。 事实上不管是View还是SurfaceView都会使用到Surface双缓冲技术,在4.1以后更是引入了三缓冲。
楼主看到的画面实际上就是Surface的三缓冲造成的。使用SurfaceView每次lockCanvas获取到的画布都是1,2,3个画布轮流切换。
Surface的多缓冲是系统可以指定的, 4.1以前默认是2个,4.2以后默认是3个,厂商可以修改,最多可以使用32个缓冲区。
(2)下次LockCanvas绘制的东西能覆盖上次LockCanvas绘制的东西,当然这里的覆盖我理解的是从LockCanvas取出来的Canvas区域中的非图像区域(指的没有绘制任何图形或者图像的区域)。举例来说,假如你从lockCanvas取出来一个50*50的canvas,但是你在该canvas左下角绘制30*50的矩形,剩余的20*50则为非图像区。但是,当前从LocakCanvas取来的canvas非图形图像是不能覆盖上上次从LockCanvas中取出来的Canvas所绘制的图像。但是对于当前从LockCanvas取出来的Canvas图形图像区域则没有这个问题,可以覆盖任何之前从LockCanvas中取出来的canvas绘制的图像。
(3)Crazy android书中关于SurfaceView描述不是很清楚,其中第一个例子关于在背景图上画图形的例子中只有在真机上能够成功运行。在虚拟机上,开始绘制图形时,背景图像就会丢失。