您的位置:首页 > 其它

surfaceview缓存问题

2015-12-22 11:11 246 查看
之前在网上看到surfaceview有双缓存机制,但是实际用起来并不是绝对的双缓存,还在网上看到有说三缓存的,但是实际操作中发现这并不是绝对的.

用surfaceview绘图的时候,先调用holder.lockCanvas()获得一个canvas,然后可以在这个canvas上继续画东西,然后调用holder.unlockCanvasAndPost(canvas)将这个canvas绘制到surfaceview上.所谓的缓存机制就是你调用lockCanvas的时候获得canvas A,然后将A绘制到surfaceview上,然后继续lockCanvas的时候获得的canvas并不是A,而是canvas
B,如果双缓存就是一次获得canvas A 和canvas B,如果是三缓存就是A B C三个.

我写了如下代码作为实验.

<span style="font-size:24px;">void draw() {
for(int i=0;i<20;i++){
Canvas c = h.lockCanvas();
c.drawText("" + i, 100, 100 + i * 20, p);
h.unlockCanvasAndPost(c);
}
}</span>
如果假设是双缓存机制,那么第一次lockcanvas得到一个canvas A,然后在上面画0,第二次获得的并不是刚才画了0的A,而是一个新的canvas B,B上面是没有0的,然后在B上面画1,然后获得A,A上面只有0,然后画2,以此类推,如果循环偶数次,最后surface上显示的是B,就是奇数1.3.5.7....,循环奇数次显示的就会是偶数0.2.4.6....

但是实验结果是



按照结果显示是三缓存机制,三个canvas循环绘制才能导致这种情况.

但是在运行一次程序发现结果变了,每次运行都是不一样的结果.







虽然前面的数字没显示出来,除了第二张图片只有一个数字,另两张图片显示都是三缓存,因为每两个数字查为2,那么前面的数字为什么没有显示,我猜测是开始的时候是双缓存,两个canvas轮着绘制,可能系统有某些机制,然后变成三缓存了,就导致了前面的数字画在了canvas A和canvas B上,然后某次lockcanvas的时候get到的是一个新的canvas C,然后三个canvas循环画,并且canvas
C是没有前面的数字的,从结果的随机性可以看到,系统究竟是采用双缓存还是三缓存可能根cpu,内存等有关,这只是我的猜测.

因为这个程序只能看到最后的结果,为了看到更详细每画一次暂定一下.

void draw() {
for(int i=0;i<20;i++){
Canvas c = h.lockCanvas();
c.drawText("" + i, 100, 100 + i * 20, p);
h.unlockCanvasAndPost(c);
try {
Thread.sleep(500);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}

发现结果稳定了,不暂停的时候每次结果是不同且不确定的,但是暂定500秒后结果稳定为:



因为这次每次刷新会暂定500ms,所以我记录了过程如下:



这张图的每一列代表一个canvas,开始显示0,然后显示1,然后2,3这四次屏幕上只有一个数字,也就是说每次都是一个新的canvas,然后显示为1,4说明用的是canvas 2,但是canvas 0只用了一次,之后就不用了,最后循环停在了19,显示的就是canvas
2.

但是我换了一个手机,结果又遍了,跟上一个类似,也是第一个canvas画一次就不用了,然后两张canvas交替,一个显示奇数,一个显示偶数,但是没有0.

搞了半天的结果就是surfaceview不是固定的双缓存或是三缓存,而是一直在变化中,唯一确定的就是有缓存机制,但是这并没有什么用.....
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: