《老罗的Android之旅》阅读笔记——SurfaceFlinger服务

Android应用程序请求SurfaceFlinger服务渲染自己的UI可以分为三步曲:

首先是创建一个到SurfaceFlinger服务的连接,

接着再通过这个连接来创建一个Surface,

最后请求SurfaceFlinger服务渲染该Surface。


根据SurfaceFlinger类的定义,得到:

       1. SurfaceFlinger服务通过一个GraphicPlane对象来管理系统的显示设备;

       2. SurfaceFlinger服务有三种类型的线程,它们分别是Binder线程、控制台事件监控线程和UI渲染线程;

       3. SurfaceFlinger服务是在UI渲染线程中执行渲染系统UI的操作的。

  • SurfaceFlinger服务的启动过程

SurfaceFlinger服务的启动过程序列图:


  • SurfaceFlinger服务是如何管理系统的硬件帧缓冲区的

SurfaceFlinger服务通过一个GraphicPlane对象来描述系统的显示屏,即系统的硬件帧缓冲区。

GraphicPlane类内部聚合了一个DisplayHardware对象,通过这个DisplayHardware对象就可以访问系统的硬件帧缓冲区。

DisplayHardware类内部又包含了一个FramebufferNativeWindow对象,这个FramebufferNativeWindow对象才是真正用来描述系统的硬件帧缓冲区的。

  • SurfaceFlinger服务三种类型的线程是如何运行和交互的

三种类型的线程,它们分别是Binder线程、UI渲染线程和控制台事件监控线程

三种类型的线程的启动顺序

       1. UI渲染线程的运行模型

SurfaceFlinger服务的UI渲染线程是以SurfaceFlinger类的成员函数threadLoop为线程执行体的

SurfaceFlinger类的成员函数threadLoop的工作过程

        2. Binder线程与UI渲染线程的交互过程

当它需要刷新自己的UI时,就会通过它所运行在的进程的SurfaceClient单例的成员函数signalServer来向SurfaceFlinger服务发送一个Binder进程间通信请求

       3. 控制台事件监控线程与UI渲染线程的交互过程

SurfaceFlinger服务的控制台事件监控线程会不断地循环调用DisplayEventThread类的成员函数threadLoop,以便可以监控硬件帧缓冲区的睡眠/唤醒状态切换事件。

SurfaceFlinger类的成员函数handleConsoleEvents处理硬件帧缓冲区睡眠事件的过程

SurfaceFlinger类的成员函数handleConsoleEvents处理硬件帧缓冲区唤醒事件的过程


  • SurfaceFlinger服务渲染Android应用程序UI的过程

通过分析SurfaceFlinger服务的UI渲染线程的执行过程来分析应用程序UI的渲染过程

SurfaceFlinger服务的UI渲染线程的执行过程如下所示:

        1. 调用SurfaceFlinger类的成员函数handleConsoleEvents来处理控制台事件。

        2. 调用SurfaceFlinger类的成员函数handleTransaction来处理系统显示屏以及应用程序窗口的属性变化,例如大小、旋转方向变化等。

        3. 调用SurfaceFlinger类的成员函数handlePageFlip来让各个应用程序窗口设置它们当前所要渲染的图形缓冲区。

        4. 如果SurfaceFlinger服务在编译的时候指定了USE_COMPOSITION_BYPASS宏,并且当前需要渲染的应用程序窗口只有一个,那么就会调用SurfaceFlinger类的成员函数handleBypassLayer来直接将这个应用程序窗口的图形缓冲区渲染到硬件帧缓冲区中去,否则的话,就要调用SurfaceFlinger类的成员函数handleRepaint来合成所有的应用程序窗口的图形缓冲区到一个主图形缓冲区中去。

        5. 调用SurfaceFlinger类的成员函数postFramebuffer将前面得到的主图形缓冲区渲染到硬件帧缓冲区中去。



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值