android fling 分析,Android图形系统分析与移植--四Surface Manager(Surface Flinge

Android图形系统分析与移植--四Surface Manager(Surface Flinge

Android图形系统分析与移植--四、Surface Manager(Surface Flinger简介)

Surface Manager是用户空间中framework下libraries中负责显示相关的一个模块,当系统同时执行多个应用程序时,SurfaceManager会负责管理显示与存取操作间的互动,另外也负责将2D绘图与3D绘图进行显示上的合成。

1、Surface manager架构分析

Android中的图形系统采用Client/Server架构,如下:

1667e295835ad0e8c66a81d11278d03b.png

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互换。

下面我们来重点研究一下Surface Flinger。

2、Surface Flinger

SurfaceFinger按英文翻译过来就是Surface投递者。SufaceFlinger的构成并不是太复杂,复杂的是他的客户端建构。SufaceFlinger主要功能是:

1) 将Layers (Surfaces) 内容的刷新到屏幕上。

2) 维持Layer的Zorder序列,并对Layer最终输出做出裁剪计算。

3) 响应Client要求,创建Layer与客户端的Surface建立连接。

4) 接收Client要求,修改Layer属性(输出大小,Alpha等设定)。

但是作为投递者的实际意义,我们首先需要知道的是如何投递,投掷物,投递路线,投递目的地。

3、Surface Flinger的基本组成框架

Surface Flinger的基本组成框架如下图所示

b9acc27395b28b234d87e1f54ef24f32.png

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抽象了。

4、SurfaceFlinger与FrameBuffer

首先SurfaceFlinger需要操作到屏幕,需要建立一个屏幕硬件缓冲区管理框架。Android在设计支持时,考虑多个屏幕的情况,引入了graphicPlane的概念。在SurfaceFlinger上有一个graphicPlane数组,每一个graphicPlane对象都对应一个DisplayHardware.在当前的Android(2.1)版本的设计中,系统支持一个graphicPlane,所以也就支持一个DisplayHardware。

SurfaceFlinger,Hardware硬件缓冲区的数据结构关系图:

183701957e0465919b0d76ae3b5920d3.png

5、 SurfaceFlinger的运行框架

SurfaceFlinger的运行框架存在于threadLoop,他是SurfaceFlinger的主循环体。threadLoop流程图如图所示:

7a8ca5c9081ee5d71dd0bc3f0e87ae21.png

1.                  handleTransaction(…)

主要计算每个Layer有无属性修改,如果有修改着内用需要重画。

2.                  handlePageFlip()

computeVisibleRegions:根据Z-Order序列计算每个Layer的可见区域和被覆盖区域。裁剪输出范围计算-

在生成裁剪区域的时候,根据Z_order依次,每个Layer在计算自己在屏幕的可显示区域时,需要经历如下步骤:

1)以自己的W,H给出自己初始的可见区域

2)减去自己上面窗口所覆盖的区域

3)在绘制时,Layer将根据自己的可见区域做相应的区域数据复制

过程如图所示:

559f8470be87602c835eaf3b5dd67efa.png

3.                  handleRepaint()

composeSurfaces(需要刷新区域):

根据每个Layer的可见区域与需要刷新区域的交集区域从Z-Order序列从底部开始绘制到主Surface上。

4.                  postFramebuffer()

该接口在Threadloop中被调用,负责将合成好的数据(存于back buffer中)推入在front buffer中,然后调用HAL接口命令底层显示。

现在将SurfaceFlinger干的事情用下面的示意图总结一下:

1881820120c9b2b071eb6f257fcc5815.png

Android图形系统分析与移植--四Surface Manager(Surface Flinge相关教程

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值