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三个.
我写了如下代码作为实验.
但是实验结果是
按照结果显示是三缓存机制,三个canvas循环绘制才能导致这种情况.
但是在运行一次程序发现结果变了,每次运行都是不一样的结果.
虽然前面的数字没显示出来,除了第二张图片只有一个数字,另两张图片显示都是三缓存,因为每两个数字查为2,那么前面的数字为什么没有显示,我猜测是开始的时候是双缓存,两个canvas轮着绘制,可能系统有某些机制,然后变成三缓存了,就导致了前面的数字画在了canvas A和canvas B上,然后某次lockcanvas的时候get到的是一个新的canvas C,然后三个canvas循环画,并且canvas
C是没有前面的数字的,从结果的随机性可以看到,系统究竟是采用双缓存还是三缓存可能根cpu,内存等有关,这只是我的猜测.
因为这个程序只能看到最后的结果,为了看到更详细每画一次暂定一下.
发现结果稳定了,不暂停的时候每次结果是不同且不确定的,但是暂定500秒后结果稳定为:
因为这次每次刷新会暂定500ms,所以我记录了过程如下:
这张图的每一列代表一个canvas,开始显示0,然后显示1,然后2,3这四次屏幕上只有一个数字,也就是说每次都是一个新的canvas,然后显示为1,4说明用的是canvas 2,但是canvas 0只用了一次,之后就不用了,最后循环停在了19,显示的就是canvas
2.
但是我换了一个手机,结果又遍了,跟上一个类似,也是第一个canvas画一次就不用了,然后两张canvas交替,一个显示奇数,一个显示偶数,但是没有0.
搞了半天的结果就是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不是固定的双缓存或是三缓存,而是一直在变化中,唯一确定的就是有缓存机制,但是这并没有什么用.....
相关文章推荐
- nginx服务器安装及配置文件详解
- 一篇文章入门Python生态系统
- 判断手机号码是否符合规则
- tableview去除多余分割线问题
- memcache的总结
- Docker学习一
- 【jQuery】检测两个节点的包含关系
- servlet 跳转到 jsp 乱码解决
- linux抓包工具tcpdump
- 【HDOJ】4162 Shape Number
- Word Pattern pattern = "abba", str = "dog cat cat dog" should return true
- WinForm窗体键盘事件,支持方向键和回车键
- 用TC、按键、易语言接入百宝云开发注册码系统
- hdoj2012水题
- Foundation框架中的NSArray类和NSMutableArray类
- 类名前自动添加前缀
- ListView分批加载数据
- Android中调用startActivity结果导致:java.lang.RuntimeException: Unable to start activity ComponentInfo{xxx}
- 打造Android一体式轮播广告条
- mysql数据库批量操作