预览加载中,请您耐心等待几秒...
1/10
2/10
3/10
4/10
5/10
6/10
7/10
8/10
9/10
10/10

亲,该文档总共24页,到这已经超出免费预览范围,如果喜欢就直接下载吧~

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

Android系统Surface机制的SurfaceFlinger服务对帧缓冲区(FrameBuffer)的管理分析 在前文中,我们分析了SurfaceFlinger服务的启动过程。SurfaceFlinger服务在启动的过程中,会对系统的硬件帧缓冲区进行初始化。由于系统的硬件帧缓冲区一般只有一个,并且不是谁都可以随便访问的,因此,它就需要由一个服务来统一管理。在Android系统中,这个服务便是SurfaceFlinger。在本文中,我们就详细分析SurfaceFlinger服务是如何管理系统的硬件帧缓冲区的。 从前面一文可以知道,SurfaceFlinger服务通过一个GraphicPlane对象来描述系统的显示屏,即系统的硬件帧缓冲区。GraphicPlane类内部聚合了一个DisplayHardware对象,通过这个DisplayHardware对象就可以访问系统的硬件帧缓冲区。DisplayHardware类内部又包含了一个FramebufferNativeWindow对象,这个FramebufferNativeWindow对象才是真正用来描述系统的硬件帧缓冲区的。FramebufferNativeWindow类的作用类似于在前面一文中所介绍的Surface类,它是连接OpenGL库和Android的UI系统的一个桥梁,OpenGL库就是通过这个桥梁来将Android系统的UI渲染到硬件帧缓冲区中去的。GraphicPlane、DisplayHardware和FramebufferNativeWindow这三个类的关系如图1所示。 接下来,我们就分别介绍GraphicPlane、DisplayHardware和FramebufferNativeWindow这三个类的实现,以便可以理解SurfaceFlinger服务是如何通过它们来管理系统的硬件帧缓冲区的。 从前面一文可以知道,SurfaceFlinger服务在启动的过程中,会对系统的硬件帧缓冲区进行初始化,如下所示: [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 status_tSurfaceFlinger::readyToRun() { ...... //weonlysupportonedisplaycurrently intdpy=0; { //initializethemaindisplay GraphicPlane&plane(graphicPlane(dpy)); DisplayHardware*consthw=newDisplayHardware(this,dpy); plane.setDisplayHardware(hw); } ...... //initializeprimaryscreen //(otherdisplayshouldbeinitializedinthesamemanner,but //asynchronously,astheycouldcomeandgo.Noneofthisissupported //yet). constGraphicPlane&plane(graphicPlane(dpy)); constDisplayHardware&hw=plane.displayHardware(); ...... hw.makeCurrent(); ...... } 这个函数定义在文件frameworks/base/services/surfaceflinger/SurfaceFlinger.cpp文件中。 这个代码段首先创建了一个DisplayHardware对象,用来初始化编号为0的GraphicPlane对象,接着再将这个DisplayHardware对象设置为系统当前活动的DisplayHardware对象,这就相当于是将编号为0的GraphicPlane对象所描述的显示屏设置为系统当前活动的显示屏。 接下来,我们就首先分析编号为0的GraphicPlane对象的初始化过程,接着再分析DisplayHardware对象的创建过程。 编号为0的GraphicPlane对象的初始化过程主要是调用GraphicPlane类的成员函数setDisplayHardware来实现的,如下所示: [cpp]viewplaincopy在CODE上查看代码片派生到我的代码片 voidGraphicPlane::setDisplayHardware(DisplayHardware*hw) { mHw=hw; //initializethedisplayorientationtransform. //it'saconstantthatshouldcomefromthedisplaydrive