4 Android显示系统之SurfaceFlinger合成

围巾🧣 2023年10月16日 757次浏览

image-20231016141316528

Android系统启动回顾

从按下电源键到 launcher 显示流程如下

boot

SurfaceFlinger 创建流程

从App图标点击到一个 Activity 展示在屏幕上流程又该是如何呢,这就涉及到 SurfaceFlinger 了

先看看 SurfaceFlinger 启动流程:

surfaceflinger

​ 在 Android显示系统之Surface 中说道,Surface在创建时会创建BufferQueue对 象,同时创建对应的生产者(App)与消费者(SurfaceFlinger::BufferQueueLayer), 此时关于渲染与合 成的通信机制便建立了。

​ 在软件与硬件渲染模型中提过, 软件渲染结束后调用unlockCanvasAndPost、硬件渲染在结束 时均会调用queueBuffer把缓冲区交换给缓冲队列。而根据BufferQueue机制, 在交还的同时会通知 给消费者, 也即BufferQueueLayer

​ 那么合成的故事从BufferQueueLayer::onFrameAvailable开始了

onFrameAvailable之后

VSync信号到来时,SurfaceFlinger最主要是通过处理INVALIDATEREFRESH消息来做合并渲 染和输出的工作的。其中INVALIDATE主要处理⼀些合成之前的准备工作, 包括屏幕和应用对窗口的 改动, Layer BufferQueue中缓冲区数据的同步等; 而REFRESH则主要处理合并和渲染输出了。

image-20231016143209937

从上述时序图可以看出, 在接收到消费者的onFrameAvailable后, 会先通知SurfaceFlinger更新 Layer, 然后执行invalidate; 而之后便是通过Sf EventThread调用requestNextVsync, 即申请下⼀个 Vsync信号。

合成准备 Invalidate

等到新的Sf Vsync到来, 开始为合成做准备工作。

image-20231016143339498

准备工作完成后, 开始合成(Refresh)

到达该步之后, 所有的Layer都在准备工作中同步完成了, Layer中的Buffer都是最新的。接下来 就是合并Layerb并提交到FrameBuffer显示。

image-20231016143447247

小结

当 VSYNC 信号到达时,SurfaceFlinger 会遍历它的层列表,以寻找新的缓冲区。如果找到新的 缓冲区,它会获取该缓冲区;

否则,它会继续使用以前获取的缓冲区。SurfaceFlinger 必须始终显示 内容,因此它会保留⼀个缓冲区。如果在某个层上没有提交缓冲区,则该层会被忽略。

SurfaceFlinger 在收集可见层的所有缓冲区之后,便会询问 Hardware Composer 应如何进行合 成。Hardware Composer HAL (HWC) 用于确定通过可用硬件来合成缓冲区的最有效方法。

对于SurfaceFlinger和HW Composer的交互, 基本遵循以下流程:

  1. SurfaceFlinger 向 HWC 提供⼀个完整的层列表,并询问“您希望如何处理这些层?”
  2. HWC 的响应方式是将每个层标记为叠加层或 GLES 合成。
  3. SurfaceFlinger 会处理所有 GLES 合成,将输出缓冲区传送到 HWC,并让 HWC 处理其余 部分。

https://www.cnblogs.com/blogs-of-lxl/p/11272756.html