Surface Manager是用户空间中framework下libraries中负责显示相关的一个模块,当系统同时执行多个应用程序时,SurfaceManager会负责管理显示与存取操做间的互动,另外也负责将2D绘图与3D绘图进行显示上的合成。c++
一、Surface manager架构分析api
Android中的图形系统采用Client/Server架构,以下:数组
Client端:应用程序相关部分。代码分为两部分,一部分是由Java提供的供应用使用的api,另外一部分则是由c++写成的底层实现。数据结构
Server端:即SurfaceFlinger,负责合成并送入buffer显示。其主要由c++代码编写而成。架构
Client和Server以前经过Binder的IPC方式进行通讯,整体结构图如图1所示:框架
如上图所示,Surface的client部分实际上是提供给各应用程序进行画图操做的一个桥梁,该桥梁经过binder通向server端的Surfaceflinger,Surfaceflinger负责合成各个surface,而后把buffer传送到FrameBuffer端进行底层显示。其中每一个surface对应2个buffer,一个frontbuffer, 一个back buffer,更新时,数据更新在back buffer上,须要显示时,则将back buffer和front buffer互换。oop
下面咱们来重点研究一下Surface Flinger。post
二、Surface Flinger
SurfaceFinger按英文翻译过来就是Surface投递者。SufaceFlinger的构成并非太复杂,复杂的是他的客户端建构。SufaceFlinger主要功能是:翻译
1) 将Layers (Surfaces) 内容的刷新到屏幕上。设计
2) 维持Layer的Zorder序列,并对Layer最终输出作出裁剪计算。
3) 响应Client要求,建立Layer与客户端的Surface创建链接。
4) 接收Client要求,修改Layer属性(输出大小,Alpha等设定)。
可是做为投递者的实际意义,咱们首先须要知道的是如何投递,投掷物,投递路线,投递目的地。
三、Surface Flinger的基本组成框架
Surface Flinger的基本组成框架以下图所示
SurfaceFlinger管理对象为:
1) mClientsMap:管理客户端与服务端的链接。
2) ISurface,IsurfaceComposer:AIDL调用接口实例
3) mLayerMap:服务端的Surface的管理对象。
4) mCurrentState.layersSortedByZ :以Surface的Z-order序列排列的Layer数组。
5) graphicPlane 缓冲区输出管理
6) OpenGL ES:图形计算,图像合成等图形库。
7) gralloc.xxx.so这是个跟平台相关的图形缓冲区管理器,是FB的硬件抽象层。
8) pmem Device,FB Device:提供共享内存,在这里只是在gralloc.xxx.so可见,在上层被gralloc.xxx.so抽象了。
四、SurfaceFlinger与FrameBuffer
首先SurfaceFlinger须要操做到屏幕,须要创建一个屏幕硬件缓冲区管理框架。Android在设计支持时,考虑多个屏幕的状况,引入了graphicPlane的概念。在SurfaceFlinger上有一个graphicPlane数组,每个graphicPlane对象都对应一个DisplayHardware.在当前的Android(2.1)版本的设计中,系统支持一个graphicPlane,因此也就支持一个DisplayHardware。
SurfaceFlinger,Hardware硬件缓冲区的数据结构关系图:
五、 SurfaceFlinger的运行框架
SurfaceFlinger的运行框架存在于threadLoop,他是SurfaceFlinger的主循环体。threadLoop流程图如图所示:
1. handleTransaction(…)
主要计算每一个Layer有无属性修改,若是有修改着内用须要重画。
2. handlePageFlip()
computeVisibleRegions:根据Z-Order序列计算每一个Layer的可见区域和被覆盖区域。裁剪输出范围计算-
在生成裁剪区域的时候,根据Z_order依次,每一个Layer在计算本身在屏幕的可显示区域时,须要经历以下步骤:
1)以本身的W,H给出本身初始的可见区域
2)减去本身上面窗口所覆盖的区域
3)在绘制时,Layer将根据本身的可见区域作相应的区域数据复制
过程如图所示:
3. handleRepaint()
composeSurfaces(须要刷新区域):
根据每一个Layer的可见区域与须要刷新区域的交集区域从Z-Order序列从底部开始绘制到主Surface上。
4. postFramebuffer()
该接口在Threadloop中被调用,负责将合成好的数据(存于back buffer中)推入在front buffer中,而后调用HAL接口命令底层显示。
如今将SurfaceFlinger干的事情用下面的示意图总结一下: