技术特工队Android知识Android开发经验谈

Android Framebuffer介绍及使用

2017-08-03  本文已影响143人  技术特工队

来自: Android技术特工队
作者: Aaron
主页: http://www.wxtlife.com/
原文连接:http://www.wxtlife.com/2017/06/07/Android-framebuffer/

如果想加入Android技术交流群,请长按识别二维码关注下方公众号,点击“加群”获取加群方式。

FrameBuffer结构图

ioctl中request参数:

双缓冲机制

Android 使用SurfaceFlinger作为屏幕合成引擎。它管理来自各个窗口的Surface objects,然后将其写入到framebuffer去。SurfaceFlinger使用前buffer来合成,后buffer来绘制。一旦绘制完成,Android通过页翻转操作,交换Y轴坐标的偏移量,选择不同buffer。在EGL显示服务初始化时,如果虚拟Y轴分辨率大于实际Y轴分辨率,说明framebuffer可以直接使用双缓冲。否则,后buffer要复制到前buffer,这样会导致页交换延迟。为了提高系统性能,Framebuffer驱动最好提供双缓冲机制。

双缓冲机制的原理

所有画图操作将它们画图的结果保存在一块系统内存区域中,这块区域通常被称作“后缓冲区(backbuffer)”,当所有的绘图操作结束之后,系统通过换页机制将绘制区域指向先前的后缓冲区,然后进行绘制显示,而原来的绘制缓冲区就变为“后缓冲区”,之后按照这种情况不停循环切换。这个复制操作通常要跟显示器的光栈束同步,以避免撕裂。双缓冲机制必须要求有比单缓冲更多的显示内存和CPU消耗时间,因为“后缓冲区”需要显示内存,而复制操作和等待同步需要CPU时间。

FrameBuffer1FrameBuffer1
framebuffer2framebuffer2

双缓冲是一种画图技术,使用这种技术可以使得画图没有(至少是减少)闪烁、撕裂等不良效果,并减少等待时间。

缓冲区切换步骤:

  1. 把fb驱动的framebuffer通过mmap映射到应用空间的内存地址map_base,一般来说framebuffer size是2*framesize或者3*framesize 大小(和平台相关)
  2. 把第一帧数据写入map_base
  3. 调用FBIOPAN_DISPLAY显示
  4. 把第二帧数据写入map_base+framesize处
  5. 调用FBIOPAN_DISPLAY
  6. 重复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 欢迎关注公众号:FutureCoder
上一篇下一篇

猜你喜欢

热点阅读