3. GPU基础与渲染管线
在车载座舱中,仪表、中控、HUD、后排娱乐往往由同一颗GPU并行驱动。理解GPU如何把一份三维场景或二维图层变成屏幕像素,是后续做合成与性能优化的基础。现代GPU的渲染管线可以概括为四个阶段:顶点处理、光栅化、片元着色、混合输出。这四个阶段在硬件上高度并行,但瓶颈往往只出现在其中某一环。
一、渲染管线的四个阶段
顶点处理阶段运行顶点着色器,负责把模型空间的顶点坐标经MVP矩阵变换到裁剪空间,并计算法线、纹理坐标、切线等属性。GPU会把顶点按图元(三角形、线段)组织,并做视锥裁剪与背面剔除。这一阶段是可编程的,但顶点数量通常远小于片元数量,因此除非模型极其复杂,顶点阶段很少成为车载场景的主瓶颈。
光栅化是固定功能阶段:把三角形离散成屏幕上的片元(候选像素),并做透视校正插值,把顶点属性插值到每个片元。光栅化还负责early-Z等可见性判断,提前丢弃被遮挡的片元,减少后续着色开销。它的输出是“片元流”,而不是最终像素。
片元着色阶段运行片元着色器,逐片元计算颜色、光照、纹理采样、透明度等。这是最“昂贵”的阶段,纹理带宽、ALU吞吐、分支发散都会直接影响帧率。车载场景中大量使用半透明图层、圆角、阴影、模糊,都会显著加重片元着色负担。
混合输出阶段把片元颜色与帧缓冲中已有颜色按混合方程合并,并写入颜色缓冲、深度缓冲、模板缓冲。混合是顺序相关的:半透明物体必须按从远到近排序,否则会出现错误叠加。最后通过显示控制器扫描输出到屏幕。
二、车载GPU的硬件特性与限制
车载GPU与手机、PC GPU同源,但约束条件完全不同。主流车载SoC(如高通8155/8295、瑞萨、TI Jacinto)多采用统一着色器架构,顶点与片元共享同一组ALU,因此顶点负载和片元负载会互相抢占资源。部分移动派生GPU采用TBDR(Tile-Based Deferred Rendering),把屏幕切成小块,在片上Tile Memory中完成着色后再写回显存,能显著降低带宽,但对频繁切换渲染目标、依赖中间纹理的合成方式不友好。
车载GPU的关键限制包括:
- 功耗与散热:座舱无主动风扇或风道有限,GPU长时间高负载会触发降频,导致帧率抖动。
- 显存带宽:多屏4K输出时,仅扫描输出就占用大量带宽,留给纹理采样的余量有限。
- 显示控制器数量:物理显示管线有限,多屏往往通过合成后统一输出,增加一次全屏读写。
- 功能安全:仪表区域要求确定性延迟,不能与娱乐应用争抢GPU导致掉帧。
- 驱动与API:多为OpenGL ES / Vulkan,驱动成熟度与PC有差距,某些扩展不可用。
三、典型场景:多图层座舱合成
假设中控屏需要同时显示:导航地图(不透明)、视频播放器(不透明)、悬浮控制栏(半透明)、通知弹窗(半透明带阴影)。渲染顺序通常为:先画不透明层,再按从远到近画半透明层。若顺序错误,弹窗会被地图遮挡或混合结果异常。
// 伪代码:正确的图层顺序
draw(mapLayer); // 不透明,可开启深度写入
draw(videoLayer); // 不透明
draw(controlBar); // 半透明,关闭深度写入,开启混合
draw(notification); // 半透明 + 阴影,最后绘制
如果每层都全屏绘制,overdraw会达到4倍以上。优化手段包括:只重绘脏区域、把静态图层缓存为纹理、用裁剪矩形限制绘制范围。在TBDR架构上,还应避免在渲染中途切换FBO,否则会强制Tile Flush,带宽优势丧失。
四、常见误区与复盘
误区一:只看顶点数判断性能。车载场景顶点数通常不高,真正压垮GPU的是片元着色和混合。一个全屏半透明模糊可能比十万个三角形更贵。
误区二:认为混合是免费的。Alpha混合需要读取帧缓冲已有颜色,是“读-改-写”操作,带宽开销是纯写入的数倍。半透明层越多,带宽越紧张。
误区三:忽略TBDR的Tile Flush。频繁切换渲染目标、使用依赖纹理、在片元着色器中写深度,都会打断Tile流水,使带宽优化失效。
复盘要点:先用GPU厂商工具(如Adreno GPU Profiler、Mali Graphics Debugger)定位瓶颈阶段,再决定优化方向。若片元着色占比高,优先减少overdraw和复杂shader;若混合输出占比高,优先降低分辨率或减少半透明层;若顶点阶段异常,检查是否提交了过多小批次draw call。
五、阶段特征速查
| 阶段 | 可编程性 | 主要开销来源 | 车载优化重点 |
|---|---|---|---|
| 顶点处理 | 可编程 | 顶点数、draw call数 | 合批、实例化、LOD |
| 光栅化 | 固定功能 | 三角形数量、小三角形 | 减少细碎图元、early-Z |
| 片元着色 | 可编程 | 纹理带宽、ALU、分支 | 降overdraw、简化shader |
| 混合输出 | 可配置 | 填充率、显存带宽 | 减少半透明层、降分辨率 |