4. 显示管线与合成机制

在智能座舱多屏系统中,应用渲染出的内容并不会直接送到屏幕,而是先进入一条由 SurfaceFlinger、硬件合成器(DPU/Display Processing Unit)和 GPU 共同参与的显示管线。理解这条管线的分工,是判断“为什么某个场景会掉帧”“为什么某块屏色彩不对”“为什么带宽不够”的基础。本节围绕图层混合、硬件合成器、GPU 合成、Overlay、Alpha Blending、色彩空间转换与带宽评估展开,重点说明各环节的职责边界与相互影响。

一、图层与合成的基本模型

Android 图形栈中,每个应用窗口、状态栏、导航栏、视频层、HUD 层通常对应一个 Layer(图层)。每个图层带有自己的 Buffer、位置、尺寸、Z 序、Alpha、变换矩阵和色彩空间信息。合成器的工作,就是把这些图层按 Z 序从底到顶叠加,输出一帧最终图像。

合成方式主要有两类:硬件合成由 DPU 内部的 Overlay 通道直接读取各图层 Buffer,在扫描输出阶段完成叠加;GPU 合成则由 SurfaceFlinger 把多个图层先渲染到一个中间 Buffer(通常称为 GPU 合成目标或 client composition target),再交给 DPU 显示。前者功耗低、延迟小,但受限于 Overlay 通道数量与格式支持;后者灵活,但会额外消耗 GPU 算力和一次内存往返。

Overlay 是硬件合成器的关键资源。以典型座舱 SoC 为例,一个显示控制器可能提供 4~8 个 Overlay 通道,其中部分通道支持 YUV 视频格式和缩放,部分仅支持 RGB 且不支持缩放。当图层数量超过可用通道,或某图层的格式、缩放比例、旋转角度不被硬件支持时,SurfaceFlinger 会把这些图层“降级”为 GPU 合成。

座舱显示管线:图层 → 合成决策 → 硬件/GPU 合成 → 色彩转换 → 扫描输出 图层 Layer 导航地图 (RGB, 缩放) 视频播放 (YUV420) 仪表 HUD (Alpha=0.8) 状态栏 (RGB, 无缩放) 副驾娱乐 (RGB, 旋转90°) 合成决策 (SurfaceFlinger) Overlay 通道数 ≥ 图层数? 格式/缩放/旋转是否支持? 满足 → 硬件合成 (Overlay 直通) 不满足 → GPU 合成 (中间 Buffer) 混合模式判定 Alpha / 不透明 / 遮挡 合成执行 DPU 硬件合成器 Overlay 通道并行读取 Alpha Blending 硬件完成 GPU 合成 Shader 逐像素混合 写入中间 Buffer 色彩空间转换 YUV ↔ RGB / sRGB ↔ P3 输出与带宽 扫描输出 DSI / DP / eDP 带宽评估 像素率 × 位深 × 图层数 + 压缩 (DSC/AFBC) 对比 DDR 可用带宽 多屏并发 中控+仪表+副驾 合成策略反馈:Overlay 不足时降级 GPU 合成 关键参数与影响 • Alpha Blending:源 Alpha、目标 Alpha、混合公式 (SrcOver / Premultiplied),影响透明叠加正确性与功耗 • 色彩空间转换:YUV420 → RGB 需矩阵+偏移;sRGB ↔ Display P3 需 3×3 矩阵与 Gamma 处理,错误会导致偏色 • 带宽评估:单层 1920×720@60fps RGBA8888 ≈ 332 MB/s;叠加 5 层并加 DSC 压缩后需重新核算 DDR 余量

二、Alpha Blending 与混合公式

Alpha Blending 决定半透明图层如何与下层叠加。Android 默认使用 Source Over 规则,且 Buffer 通常采用预乘 Alpha(Premultiplied Alpha)。预乘的含义是:RGB 分量已经乘以 Alpha 值,因此混合公式简化为:

输出 = 源RGB + 目标RGB × (1 - 源Alpha)

其中源RGB已预乘,源Alpha ∈ [0,1]

如果应用错误地提交了非预乘 Buffer,而合成器按预乘处理,半透明边缘会出现发白或发黑。判断方法:在 SurfaceFlinger 的合成日志中查看图层格式,若为 RGBA_8888 但应用侧未设置 PREMULTIPLIED,则需在应用层修正。硬件合成器通常对预乘 Alpha 有原生支持,GPU 合成则通过 Shader 中的 blendFunc(SRC_ALPHA, ONE_MINUS_SRC_ALPHA) 或预乘模式实现。

三、色彩空间转换

座舱中常见色彩空间包括 sRGB、Display P3、Rec.2020,以及视频的 BT.601/BT.709 YUV。当视频层为 YUV420、UI 层为 sRGB 时,合成器必须在同一输出色彩空间下工作。典型处理链为:YUV → RGB(矩阵+偏移)→ 线性化 → 色彩空间矩阵变换 → Gamma 编码 → 输出。

以 BT.709 有限范围 YUV 转 RGB 为例,常用系数为:

R = 1.164(Y-16) + 1.793(Cr-128)
G = 1.164(Y-16) - 0.213(Cb-128) - 0.533(Cr-128)
B = 1.164(Y-16) + 2.112(Cb-128)

若忽略有限范围偏移(16~235),黑色会变成灰,白色会过曝。实际调试中,可通过显示纯黑、纯白、灰阶测试图,观察是否出现“黑不够黑、白不够白”来判断范围处理是否正确。Display P3 与 sRGB 之间的转换则依赖 3×3 矩阵,若矩阵系数错误,红色和绿色区域会明显偏色。

四、带宽评估方法

带宽是座舱多屏系统最容易触顶的资源。评估时按“每图层每帧字节数 × 帧率 × 图层数”估算,再叠加读写方向。以 1920×720、RGBA8888(4 字节/像素)、60fps 为例:

单层单帧 = 1920 × 720 × 4 = 5,529,600 B ≈ 5.27 MB
单层带宽 = 5.27 MB × 60 = 316 MB/s
5 层叠加 = 316 × 5 ≈ 1.58 GB/s(仅读取,未计写入)

若同时驱动中控 1920×720、仪表 1280×480、副驾 1920×720 三块屏,且每屏 4~6 层,总带宽需求可能达到 4~6 GB/s。此时需引入 AFBC(Arm Frame Buffer Compression)或 DSC(Display Stream Compression)降低实际传输量。AFBC 对 UI 内容通常可压缩 30%~50%,DSC 对视频链路可做到视觉无损的 2:1~3:1 压缩。

评估带宽时,不要只看“读取”,GPU 合成还会产生一次“写入中间 Buffer + 再读取”的额外往返,通常使该路径带宽翻倍。因此优先让更多图层走 Overlay 直通,是降低带宽和功耗最直接的手段。

五、合成策略的实践判断

实际调试中,可通过以下信号判断合成是否健康:

  • Overlay 使用率:若长期低于图层数,说明大量图层被降级为 GPU 合成,需检查格式、缩放、旋转是否超限。
  • GPU 合成耗时:单帧 GPU 合成超过 4~6ms,在多屏 60fps 下容易造成掉帧。
  • 色彩异常:黑变灰、白过曝、红绿偏色,分别指向范围偏移、Gamma、色彩矩阵问题。
  • 带宽余量:DDR 峰值占用持续超过 70%,在并发场景下容易出现卡顿。

一个可执行的优化顺序是:先确认图层格式与缩放是否可被 Overlay 接受,再检查 Alpha 是否预乘,然后核对色彩空间转换矩阵与范围,最后用带宽公式核算多屏并发余量。每一步都对应明确的观察点和判断依据,而不是笼统地“调一调参数”。

示例中的带宽数值为按公式估算的教学示例,并非某款具体 SoC 的实测结果。实际项目中应以芯片手册的 DDR 带宽、DPU Overlay 能力和压缩支持为准,并结合 SurfaceFlinger 的合成统计与性能计数器进行验证。