来自: Android技术特工队
作者: Aaron
主页: http://www.wxtlife.com/
原文连接:http://www.wxtlife.com/2017/06/07/Android-framebuffer/
如果想加入Android技术交流群,请长按识别二维码关注下方公众号,点击“加群”获取加群方式。
FrameBuffer结构图ioctl中request参数:
- FBIOGET_VSCREENINFO 表示用户获取屏幕的可变参数;
- FBIOPUT_VSCREENINFO 表示用户设置可变的屏幕参数;
- FBIOGET_FSCREENINFO 表示用户获得屏幕的固定参数;
- FBIOBLANK表示调用sep4020fb_blank函数清空液晶屏;
- FBIOPUTCMAP 表示设置屏幕的颜色表;
- FBIOGETCMAP 表示获得颜色表。
双缓冲机制
Android 使用SurfaceFlinger作为屏幕合成引擎。它管理来自各个窗口的Surface objects,然后将其写入到framebuffer去。SurfaceFlinger使用前buffer来合成,后buffer来绘制。一旦绘制完成,Android通过页翻转操作,交换Y轴坐标的偏移量,选择不同buffer。在EGL显示服务初始化时,如果虚拟Y轴分辨率大于实际Y轴分辨率,说明framebuffer可以直接使用双缓冲。否则,后buffer要复制到前buffer,这样会导致页交换延迟。为了提高系统性能,Framebuffer驱动最好提供双缓冲机制。
双缓冲机制的原理
所有画图操作将它们画图的结果保存在一块系统内存区域中,这块区域通常被称作“后缓冲区(backbuffer)”,当所有的绘图操作结束之后,系统通过换页机制将绘制区域指向先前的后缓冲区,然后进行绘制显示,而原来的绘制缓冲区就变为“后缓冲区”,之后按照这种情况不停循环切换。这个复制操作通常要跟显示器的光栈束同步,以避免撕裂。双缓冲机制必须要求有比单缓冲更多的显示内存和CPU消耗时间,因为“后缓冲区”需要显示内存,而复制操作和等待同步需要CPU时间。
FrameBuffer1framebuffer2
双缓冲是一种画图技术,使用这种技术可以使得画图没有(至少是减少)闪烁、撕裂等不良效果,并减少等待时间。
缓冲区切换步骤:
- 把fb驱动的framebuffer通过mmap映射到应用空间的内存地址map_base,一般来说framebuffer size是2*framesize或者3*framesize 大小(和平台相关)
- 把第一帧数据写入map_base
- 调用FBIOPAN_DISPLAY显示
- 把第二帧数据写入map_base+framesize处
- 调用FBIOPAN_DISPLAY
- 重复step2~step5
FBIOPAN_DISPLAY 在linux的注释里是“平移显示”的意思,调用FBIOPAN_DISPLAY时,会传一个y坐标偏移量yoffset给驱动,然后驱动会把当前显存的指针偏移 “yoffset X 屏幕宽度 X 位色字节数” 个字节,这样就好像实现了图像的y坐标平移,也就是“平移显示”。当这个yoffset等于屏幕高度的时候,就实现了显存的切换。
参考链接
http://www.cnblogs.com/armlinux/archive/2012/02/25/2396760.html
http://blog.csdn.net/yangwen123/article/details/12096483
如果想加入Android技术交流群,请长按识别二维码关注下方公众号,点击“加群”获取加群方式。
欢迎关注公众号:FutureCoder
网友评论