HWC(HWComposer)
HWC 的全称是 Hardware Composer,即硬件合成器,是 Android 图形渲染管线中连接 SurfaceFlinger 与显示硬件的核心中间层组件,其核心使命是利用硬件加速能力完成多图层合成,替代 CPU 软件合成,大幅降低系统资源占用、提升渲染性能。
一、 HWC 的核心定位与价值
1. 核心定位
- HWC 是运行在系统空间的底层模块(通常由芯片厂商适配,基于显示硬件的驱动实现),向上为
SurfaceFlinger提供标准化的合成接口,向下直接操控 GPU / 显示处理器(DPU,Display Processing Unit)等硬件。 - HWC 是
SurfaceFlinger完成图层合成的核心依赖——SurfaceFlinger本身不直接处理合成的硬件指令,而是将合成任务交给 HWC 决策和执行。
2. 核心价值(对比软件合成)
Android 系统中图层合成有两种方式,HWC 主导的硬件合成相比传统 CPU 软件合成有质的提升:
| 合成方式 | 核心执行者 | 性能表现 | CPU 占用 | 适用场景 |
|---|---|---|---|---|
| 硬件合成(HWC 主导) | GPU/DPU 等专用硬件 | 极高(并行处理多图层) | 极低(几乎不占用 CPU) | 绝大多数常规图层(无复杂变换) |
| 软件合成(RenderEngine 主导) | CPU | 低(逐像素串行绘制) | 极高(图层越多,占用越高) | 复杂变换图层(如透视、自定义 Shader) |
简单来说:HWC 是 Android 设备 UI 流畅的关键硬件支撑,没有 HWC 的硬件加速,高刷新率屏幕、多应用分屏等功能都无法流畅运行。
二、 HWC 的核心工作原理
HWC 的工作流程完全嵌入在 SurfaceFlinger 的合成周期中,核心分为「合成决策」和「合成执行」两步:
步骤 1:SurfaceFlinger 向 HWC 提交图层信息
当 SurfaceFlinger 接收到 VSYNC 信号触发合成周期时:
SurfaceFlinger会收集当前所有待合成的图层(如应用窗口、状态栏、导航栏),整理每个图层的关键信息:
- 图层的 Z-Order 层级(显示顺序);
- 图层的
GraphicBuffer地址(存储渲染数据的内存缓冲区); - 图层的变换参数(如缩放、旋转、透明度);
- SurfaceFlinger` 将这些图层信息传递给 HWC,请求 HWC 进行合成决策。
步骤 2:HWC 执行合成决策(核心环节)
HWC 会根据自身硬件能力,对图层进行分类,决定哪些图层用硬件合成,哪些图层需要降级为软件合成,决策规则如下:
硬件合成支持的图层:
无复杂变换的普通图层(如静态界面、简单平移的 View);
透明度、缩放、旋转等基础变换的图层(HWC 硬件可直接处理);
符合硬件格式要求的
GraphicBuffer(如 RGB 格式)。对于这类图层,HWC 会标记为
HWC_OVERLAY类型,意味着可以直接由 GPU/DPU 硬件合成,无需 CPU 参与。
硬件合成不支持的图层:
带复杂变换的图层(如 3D 透视、自定义 OpenGL Shader 效果);
硬件不支持的图像格式(如 YUV 格式未做硬件适配);
图层数量超过硬件最大支持数(如部分低端硬件仅支持 4-8 个硬件图层)。
对于这类图层,HWC 会标记为
HWC_FRAMEBUFFER类型,通知SurfaceFlinger:这些图层需要先由 CPU 软件合成,再参与硬件合成。
步骤 3:执行合成操作
根据决策结果,分两种情况完成合成:
纯硬件合成(最优情况)
若所有图层都支持硬件合成,HWC 会直接指挥 GPU/DPU:
从每个图层的
GraphicBuffer中读取渲染数据;按照 Z-Order 层级,在硬件层面完成图层的叠加、混合(零拷贝机制,无需拷贝数据到临时缓冲区);
将合成后的最终帧缓冲区直接传递给显示控制器,等待 VSYNC 信号触发屏幕刷新。
这个过程几乎不占用 CPU,合成效率极高。
混合合成(硬件 + 软件)
若存在不支持硬件合成的图层:
第一步:
SurfaceFlinger调用RenderEngine(软件渲染引擎),使用 CPU 将这些特殊图层合成到一个临时GraphicBuffer中;第二步:HWC 将这个临时
GraphicBuffer视为普通图层,与其他支持硬件合成的图层一起,完成最终的硬件合成;第三步:输出到显示控制器。
这种模式会增加 CPU 开销,是导致卡顿的常见原因之一。
三、 HWC 的关键版本演进
HWC 随着 Android 版本迭代不断升级,能力越来越强,主流版本如下:
| HWC 版本 | 对应 Android 版本 | 核心升级点 |
|---|---|---|
| HWC 1.0 | Android 4.0+ | 基础硬件合成能力,仅支持简单图层叠加,不支持高刷新率 |
| HWC 2.0 | Android 7.0+ | 1. 支持多显示设备(如主屏 + 外接显示器);2. 支持图层的动态属性修改(如实时调整透明度);3. 大幅提升硬件图层数量上限 |
| HWC 3.0 | Android 10.0+ | 1. 支持 90Hz/120Hz 等高刷新率屏幕;2. 支持 HDR 显示效果的硬件合成;3. 优化低功耗模式下的合成效率 |
四、 HWC 与应用开发的关联
应用层开发者无法直接调用 HWC,但可以通过优化应用的 UI 实现,让 HWC 更高效地完成硬件合成,从而提升应用流畅度,核心优化建议如下:
- 减少图层数量
- 避免过多的悬浮窗、透明 View、重叠 View,减少 HWC 的合成压力;
- 使用
ViewGroup.mergeChildren()合并子 View,减少过度绘制和图层拆分。
- 避免复杂图层变换
- 尽量少用
setRotationX()/setRotationY()等 3D 变换,这类变换会触发软件合成; - 简单的平移、缩放、透明度调整可放心使用(HWC 硬件原生支持)。
- 尽量少用
- 合理使用 SurfaceView/TextureView
- 视频播放、相机预览等场景优先使用
SurfaceView,其Surface可直接被 HWC 识别为独立硬件图层,避免与 UI 图层混合后触发软件合成; TextureView会将内容渲染到 UI 图层中,可能增加软件合成概率,非必要不使用。
- 视频播放、相机预览等场景优先使用
- 通过工具分析合成类型
- 使用 Systrace 工具,添加
gfx/surfaceflinger标签,可查看每个图层的合成类型(HWC_OVERLAY为硬件合成,HWC_FRAMEBUFFER为软件合成); - 若大量图层显示为
HWC_FRAMEBUFFER,需优化 UI 实现。
- 使用 Systrace 工具,添加
五、 总结
- HWC 是硬件合成器,是
SurfaceFlinger与显示硬件的中间层,核心是用 GPU/DPU 替代 CPU 完成图层合成。 - 核心工作流程:
SurfaceFlinger提交图层信息 → HWC 决策合成类型 → 硬件 / 混合合成 → 输出到屏幕。 - 性能核心:硬件合成(
HWC_OVERLAY)是最优路径,软件合成会增加 CPU 开销,应尽量避免。 - 应用优化:减少图层数量、避免复杂变换、优先用
SurfaceView,让 HWC 以最高效的方式工作。