Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

 参考:Android系统Surface机制的SurfaceFlinger服务渲染应用程序UI的过程分析

 一句话概括一下Android应用程序显示的过程:Android应用程序调用SurfaceFlinger服务把经过测量、布局和绘制后的Surface渲染到显示屏幕上。

 

 postFramebuffer

        SurfaceFlinger类的成员函数postFramebuffer用来将系统的主显示屏的内容渲染到硬件帧缓冲区中去,它的执行过程如图11所示:

图11 SurfaceFlinger服务渲染系统主显示屏的内容到硬件帧缓冲区的过程

        这个过程可以划分为4步骤,接下来我们就详细分析每一个步骤。

        Step 1. SurfaceFlinger.postFramebuffer

 

[cpp] view plain copy
 
 在CODE上查看代码片派生到我的代码片
  1. void SurfaceFlinger::postFramebuffer()  
  2. {  
  3.     if (!mInvalidRegion.isEmpty()) {  
  4.         const DisplayHardware& hw(graphicPlane(0).displayHardware());  
  5.         const nsecs_t now = systemTime();  
  6.         mDebugInSwapBuffers = now;  
  7.         hw.flip(mInvalidRegion);  
  8.         mLastSwapBufferTime = systemTime() - now;  
  9.         mDebugInSwapBuffers = 0;  
  10.         mInvalidRegion.clear();  
  11.     }  
  12. }  

        这个函数定义在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp中。

 

        在前面第4部分内容的Step 1中提到,SurfaceFlinger类的成员变量mInvalidRegion用来描述系统主显示屏的脏区域,即SurfaceFlinger服务当前需要渲染的区域。函数首先得到用来描述系统主显示屏的一个DisplayHardware对象hw,接着再调用这个DisplayHardware对象hw的成员函数flip来渲染这个脏区域。

        接下来,我们就继续分析DisplayHardware类的成员函数flip的实现。

        Step 2.  DisplayHardware.flip

        这个函数定义在文件frameworks/base/services/surfaceflinger/DisplayHardware/DisplayHardware.cpp中,在前面Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析一文中,我们已经分析过它的实现了。这个函数会检查系统是否支持部分更新功能。如果支持的话,那么就先设置要更新的区域,否则的话,就直接调用函数eglSwapBuffers来将前面已经合成好的了图形缓冲区渲染到硬件帧缓冲区去。

        从前面Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析一文可以知道,调用函数eglSwapBuffers在渲染图形缓冲区的时候,会导致FramebufferNativeWindow类的成员函数queueBuffer被调用,后者会通过HAL层的Gralloc模块来执行渲染硬件帧缓冲区的操作。

       Step 3. FramebufferNativeWindow.queueBuffer

       这个函数定义在文件frameworks/base/libs/ui/FramebufferNativeWindow.cpp中,同样,在前面Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(Frame Buffer)的管理分析一文中,我们已经分析过它的实现了。这个函数主要就是通过HAL层的Gralloc模块中的framebuffer_device_t设备的成员函数post来执行渲染硬件帧缓冲区的操作。

       Step 4. framebuffer_device_t.post

       这个函数指向定义在HAL层的Gralloc模块中的函数fb_post,后者定义在文件hardware/libhardware/modules/gralloc/framebuffer.cpp,在前面Android帧缓冲区(Frame Buffer)硬件抽象层(HAL)模块Gralloc的实现原理分析一文中,我们已经分析过这个函数的实现了。由于要渲染的图形缓冲区是用于渲染系统主显示屏的,因此,它是直接在硬件帧缓冲区上分配的,这时候函数fb_post就会通过IO控制命令FBIOPUT_VSCREENINFO来通知位于内核空间的fb驱动来将系统主显示屏的UI绘制出来。

       至此,SurfaceFlinger服务渲染系统主显示屏的内容到硬件帧缓冲区的过程就分析完成了,整个SurfaceFlinger服务渲染应用程序UI的过程也分析完成了。

       这样,我们就通过Android应用程序与SurfaceFlinger服务的关系概述和学习计划Android系统Surface机制的SurfaceFlinger服务简要介绍和学习计划这两个系列的文章系统地分析了Android系统的SurfaceFlinger服务的实现,为后面我们后面进一步分析Android系统的UI架构打下坚实的基础!

 

posted @ 2016-04-27 22:42  tiger168  阅读(1438)  评论(0编辑  收藏  举报