《老罗的Android之旅》阅读笔记——应用程序与SurfaceFlinger服务的关系


SurfaceFlinger服务:运行在Android系统的System进程中,负责管理Android系统的帧缓冲区(Frame Buffer)。


每一个Android应用程序与SurfaceFlinger服务都有一个连接,这个连接都是通过一个类型为Client的Binder对象来描述的。

每一个Android应用程序与SurfaceFlinger服务之间的连接上加上一块用来传递UI元数据的匿名共享内存,这个匿名共享内存结构化为SharedClient。



每一个SharedClient里面,有至多31个SharedBufferStack;一个SharedClient对应一个Android应用程序

每一个SharedBufferStack用来描述一系列需要按照一定规则来访问的缓冲区。

真正的UI数据保存在GraphicBuffer中

  • Android应用程序与SurfaceFlinger服务建立连接的过程

SurfaceComposerClient对象负责创建一个到SurfaceFlinger服务的连接。

成员函数getControlBlock用来获得由SurfaceFlinger服务创建的一块用来传递UI元数据的匿名共享内存,

成员函数createSurface用来请求SurfaceFlinger服务创建一个Surface

应用程序bootanimation与SurfaceFlinger服务建立一个连接的序列图:

  • 保存UI元数据的匿名共享内存的创建过程

Android系统就通过一个单例模式的类来专负责创建和管理这个SharedClient对象

创建匿名共享内存相关的类:SurfaceClient、UserClient、SharedClient

UserClient类与Client类最重要的区别是:

前者实现了ISurfaceComposerClient接口的成员函数getControlBlock,

后者实现了ISurfaceComposerClient接口的成员函数createSurface

共享UI元数据的创建过程序列图:

UserClient类的成员变量mCblkHeap指向了一块匿名共享内存,

UserClient类将这块匿名共享内存返回给Android应用程序之后,Android应用程序就会将它结构化成一个SharedClient对象来访问,并且保存在SurfaceClient类的成员变量mControl中

  • Android应用程序请求SurfaceFlinger服务创建Surface的过程

Surface理解为一个绘图表面,

Android应用程序负责往这个绘图表面填内容,

SurfaceFlinger服务负责将这个绘图表面的内容取出来,并且渲染在显示屏上。


从SurfaceFlinger服务侧:

Layer类内部的成员变量mUserClientRef指向了一个ClientRef对象

ClientRef对象内部成员变量mControlBlock指向了一个SharedBufferServer对象;

SharedBufferServer类是用来在SurfaceFlinger服务这一侧描述一个UI元数据缓冲区堆栈的,

即在SurfaceFlinger服务中,每一个绘图表面,即一个Layer对象,都关联有一个UI元数据缓冲区堆栈。


Android应用程序这一侧

每一个绘图表面都使用一个Surface对象来描述

每一个Surface对象都是由一个SurfaceControl对象来创建的。

SurfaceControl类的成员变量mSurface,指向了一个类型为BpSurface的Binder代理对象,而这个Binder代理对象引用的是一个Layer::SurfaceLayer对象。

SurfaceControl类的成员变量mSurfaceData,指向了一个Surface对象。

Surface类的成员变量mSharedBufferClient指向了一个SharedBufferClient对象;

SharedBufferClient类是用来在Android应用程序这一侧描述一个UI元数据缓冲区堆栈的。

Surface类继承了EGLNativeBase类,而EGLNativeBase类又继承了ANativeWindow类,

Android系统为OpenGL库提供的本地窗口使用ANativeWindow类来描述。


一个绘图表面,在SurfaceFlinger服务和Android应用程序中分别对应有一个Layer对象和一个Surface对象

这两个对象在内部分别使用一个SharedBufferServer对象和一个SharedBufferClient对象来描述这个绘图表面的UI元数据缓冲堆栈


当Android应用程序请求SurfaceFlinger服务创建一个Surface的时候:

需要在SurfaceFlinger服务这一侧创建一个Layer对象、一个Layer::SurfaceLayer对象和一个SharedBufferServer对象;

需要在Android应用程序这一侧创建一个SurfaceControl对象、一个Surface对象和一个SharedBufferClient对象。


SurfaceComposerClient类的成员函数createSurface开始描述Android应用程序请求SurfaceFlinger服务创建Surface的过程:


  • Android应用程序请求SurfaceFlinger服务渲染Surface的过程

  Android应用程序渲染一个Surface的过程大致如下所示:

       1. 从UI元数据缓冲区堆栈中得到一个空闲的UI元数据缓冲区;

       2. 请求SurfaceFlinger服务为这个空闲的UI元数据缓冲区分配一个图形缓冲区;

       3. 在图形缓冲区上面绘制好UI之后,即填充好UI数据之后,就将前面得到的空闲UI元数据缓冲区添加到UI元数据缓冲区堆栈中的待渲染队列中去;

       4. 请求SurfaceFlinger服务渲染前面已经准备好了图形缓冲区的Surface;

       5. SurfaceFlinger服务从即将要渲染的Surface的UI元数据缓冲区堆栈的待渲染队列中找到待渲染的UI元数据缓冲区;

       6. SurfaceFlinger服务得到了待渲染的UI元数据缓冲区之后,接着再找到在前面第2步为它所分配的图形缓冲区,最后就可以将这个图形缓冲区渲染到设备显示屏上去。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值