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将前面得到的主图形缓冲区渲染到硬件帧缓冲区中去。