2. 嵌入式图形系统概述

嵌入式图形系统并不是“把桌面 OpenGL 搬到小屏幕上”这么简单。它由嵌入式 GPU、显示子系统、帧缓冲以及图形管线四大部分协同构成,任何一环的带宽、格式或时序不匹配,都会直接表现为花屏、撕裂、掉帧或功耗飙升。理解这四者的分工与数据流向,是后续编写 OpenGL ES 程序、调试渲染问题的前提。

一、嵌入式 GPU 架构:从 Tile 到统一渲染

嵌入式 GPU 与桌面 GPU 最大的差异在于对功耗和带宽的极致约束。桌面 GPU 普遍采用立即模式(IMR,Immediate Mode Rendering),每个图元一到达就立即光栅化并写入显存;而移动端大量采用分块渲染(TBR,Tile-Based Rendering),先把一帧的几何数据缓存到参数缓冲,再按屏幕划分的小块(Tile,常见 16×16 或 32×32 像素)逐块渲染。

分块渲染的关键优势是:每个 Tile 的颜色、深度数据可以驻留在 GPU 内部的片上高速缓存(On-Chip Buffer)中,只有最终结果才写回系统内存,从而把外部内存带宽降低数倍。在此基础上还有 TBDR(Tile-Based Deferred Rendering),它在每个 Tile 内先做隐藏面消除,再着色,进一步减少无效像素的着色开销。典型代表如 ARM Mali、Imagination PowerVR、Qualcomm Adreno 均属此类架构。

对开发者而言,TBR 架构带来两个必须遵守的实践约束:一是避免在渲染中途频繁切换帧缓冲或读取当前帧缓冲(如 glReadPixels),否则会强制 Tile 提前刷新,破坏片上缓存优势;二是尽量让不透明物体先画、透明物体后画,以提升隐藏面消除命中率。

二、显示子系统与帧缓冲

显示子系统(Display Subsystem)负责把 GPU 渲染好的图像按时序送到屏幕。它通常包含显示控制器(Display Controller)、图层合成器(Compositor/Overlay)、MIPI DSI 或 HDMI 等输出接口,以及时序发生器。显示控制器按固定刷新率(如 60Hz)从帧缓冲中扫描像素,这个扫描过程与 GPU 的渲染过程是异步的。

帧缓冲(Framebuffer)是显示控制器读取像素的内存区域,通常采用双缓冲甚至三缓冲:GPU 渲染到后台缓冲(Back Buffer),渲染完成后通过交换(Swap)把后台缓冲变为前台缓冲(Front Buffer),显示控制器再从新的前台缓冲扫描。若交换发生在扫描中途,就会出现画面撕裂(Tearing),因此需要垂直同步(VSync)来对齐。

帧缓冲的像素格式直接影响带宽与画质。常见格式如下表:

格式每像素位数特点与适用场景
RGB56516 bit带宽低,色彩有阶梯,适合低端屏
RGB88824 bit色彩完整,无 Alpha,常用作不透明层
ARGB888832 bit带 Alpha,支持混合,UI 合成首选
RGB10A232 bitHDR 场景,色深更高

此外,帧缓冲还涉及多重采样(MSAA)缓冲、深度/模板缓冲等附属区域,它们同样占用内存带宽,在嵌入式平台上需要谨慎开启。

三、图形管线的基本概念

图形管线(Graphics Pipeline)描述了从顶点数据到屏幕像素的完整处理链路。OpenGL ES 的可编程管线主要阶段为:顶点着色器 → 图元装配 → 光栅化 → 片元着色器 → 逐片元操作(深度测试、混合、写入帧缓冲)。其中顶点着色器和片元着色器是开发者可编程的部分,其余为固定功能阶段。

下面这张图展示了嵌入式图形系统中从应用数据到屏幕显示的完整数据流,包含 GPU 内部管线、帧缓冲与显示子系统的衔接关系:

嵌入式图形系统数据流 应用 / 引擎 顶点/纹理/状态 顶点着色器 坐标变换 / 光照 图元装配 / 光栅化 生成片元 片元着色器 纹理采样 / 混合 逐片元操作 深度/模板/混合 帧缓冲 Framebuffer Back / Front Buffer 显示控制器 时序 / 图层合成 屏幕 MIPI DSI TBR 分块渲染内部结构 参数缓冲 Tile 片上缓存 写回帧缓冲

四、典型应用场景与常见误区

嵌入式图形系统的典型场景包括:车载仪表与中控 HMI、智能手表表盘、工业 HMI 触摸屏、机顶盒与智能电视 UI、AR/VR 头显的近眼显示等。这些场景的共同特点是分辨率相对固定、刷新率要求明确、功耗与散热受限,且往往需要多图层叠加(视频层 + UI 层 + 光标层)。

初学者常见的误区有:

  • 把 glReadPixels 当作常规取图手段:在 TBR 架构上会强制 Tile 刷新,帧率可能直接腰斩。
  • 忽略帧缓冲格式:在低端设备上误用 ARGB8888 导致带宽超限,出现掉帧。
  • 不区分双缓冲与三缓冲:三缓冲可缓解卡顿,但会增加一帧延迟,交互类应用需权衡。
  • 认为 GPU 越快越好:显示子系统的时序与合成能力往往才是瓶颈,GPU 空转等待 VSync 是常态。
调试建议:先用 adb shell dumpsys SurfaceFlinger 或平台对应的显示调试工具查看图层合成与 VSync 情况,再结合 GPU 厂商的性能计数器(如 Mali 的 Streamline、Adreno 的 Snapdragon Profiler)定位是几何、纹理还是带宽瓶颈。
核心记忆点:嵌入式图形系统 = 分块渲染 GPU + 异步显示子系统 + 双/三缓冲帧缓冲 + 可编程图形管线。四者通过带宽与 VSync 耦合,任何一处的配置错误都会在最终画面上暴露。