Android系统启动回顾
从按下电源键到 launcher 显示流程如下
SurfaceFlinger 创建流程
从App图标点击到一个 Activity 展示在屏幕上流程又该是如何呢,这就涉及到 SurfaceFlinger 了
先看看 SurfaceFlinger 启动流程:
在 Android显示系统之Surface 中说道,Surface在创建时会创建BufferQueue
对 象,同时创建对应的生产者(App)与消费者(SurfaceFlinger::BufferQueueLayer
), 此时关于渲染与合 成的通信机制便建立了。
在软件与硬件渲染模型中提过, 软件渲染结束后调用unlockCanvasAndPost
、硬件渲染在结束 时均会调用queueBuffer
把缓冲区交换给缓冲队列。而根据BufferQueue
机制, 在交还的同时会通知 给消费者, 也即BufferQueueLayer
。
那么合成的故事从BufferQueueLayer::onFrameAvailable
开始了
onFrameAvailable之后
当VSync
信号到来时,SurfaceFlinger
最主要是通过处理INVALIDATE
和REFRESH
消息来做合并渲 染和输出的工作的。其中INVALIDATE
主要处理⼀些合成之前的准备工作, 包括屏幕和应用对窗口的 改动, Layer BufferQueue
中缓冲区数据的同步等; 而REFRESH
则主要处理合并和渲染输出了。
从上述时序图可以看出, 在接收到消费者的onFrameAvailable
后, 会先通知SurfaceFlinger更新 Layer, 然后执行invalidate
; 而之后便是通过Sf EventThread调用requestNextVsync
, 即申请下⼀个 Vsync信号。
合成准备 Invalidate
等到新的Sf Vsync到来, 开始为合成做准备工作。
准备工作完成后, 开始合成(Refresh)
到达该步之后, 所有的Layer都在准备工作中同步完成了, Layer中的Buffer都是最新的。接下来 就是合并Layerb并提交到FrameBuffer
显示。
小结
当 VSYNC 信号到达时,SurfaceFlinger 会遍历它的层列表,以寻找新的缓冲区。如果找到新的 缓冲区,它会获取该缓冲区;
否则,它会继续使用以前获取的缓冲区。SurfaceFlinger 必须始终显示 内容,因此它会保留⼀个缓冲区。如果在某个层上没有提交缓冲区,则该层会被忽略。
SurfaceFlinger 在收集可见层的所有缓冲区之后,便会询问 Hardware Composer 应如何进行合 成。Hardware Composer HAL (HWC) 用于确定通过可用硬件来合成缓冲区的最有效方法。
对于SurfaceFlinger和HW Composer的交互, 基本遵循以下流程:
- SurfaceFlinger 向 HWC 提供⼀个完整的层列表,并询问“您希望如何处理这些层?”
- HWC 的响应方式是将每个层标记为叠加层或 GLES 合成。
- SurfaceFlinger 会处理所有 GLES 合成,将输出缓冲区传送到 HWC,并让 HWC 处理其余 部分。