在 Android 图形系统中,SurfaceFlinger 和 Hardware Composer (HWC) 是紧密协作的两个核心组件,共同负责屏幕内容的合成与显示。它们的关系可以用 “决策者与执行者” 来概括:
首先HWC中
DEVICE:指“显示设备硬件”(如 Overlay 引擎、MIPI-DSI 控制器)。
CLIENT:指“客户端”(即 SurfaceFlinger 的 GPU 合成后端)。
步骤 1:图层收集与准备
SurfaceFlinger:
从各个应用(如 Camera、Launcher)收集 Layer(每个 Layer 对应一个 BufferQueue 的输出)。
计算每个图层的可见性、位置、透明度等属性(通过 CompositionEngine)。
步骤 2:合成策略决策
SurfaceFlinger 询问 HWC:
通过 HWC::validate() 向 HWC 提交所有图层信息。
HWC 返回每个图层的合成方式建议:
硬件合成(Overlay):由显示控制器(Display Controller)直接处理(性能最优)。
GPU合成:无法硬件合成时(如复杂变换),回退到 GPU 渲染(通过 OpenGL ES)。
混合合成:部分图层用 Overlay,部分用 GPU。
步骤 3:执行合成
HWC 通过 HWC::present() 执行最终合成:
直接操作显示硬件将图层送入屏幕(避免 GPU 参与,降低功耗)。
处理 VSync 信号,确保合成的帧在正确时机显示(防撕裂)。
步骤 4:反馈与优化
HWC 动态调整策略(如根据负载切换 Overlay/GPU 合成)。
SurfaceFlinger 根据 HWC 的能力调整图层分配(如避免频繁切换合成方式)。
关键代码路径
SurfaceFlinger:frameworks/native/services/surfaceflinger/DisplayHardware/HWC2.cpp(HWC 交互)。frameworks/native/services/surfaceflinger/CompositionEngine/(合成逻辑)。HWC 实现:厂商 HAL 层:hardware/interfaces/graphics/composer/2.1/