中EN
概念页

像素与帧缓冲优化

Pixel & Framebuffer Optimization

需要着色的像素通常远多于顶点,所以像素处理优化往往最划算。核心手段:保证占用率以隐藏纹理延迟、按距离切换着色器 LOD、利用 early-z 并通过从前往后排序或 z-prepass 减少过度绘制、缩小帧缓冲每像素存储(色度子采样、YCoCg 棋盘),以及只在需要时开启混合、避免 GPU 回读。几何与光栅化阶段的常用优化也一并列出。

几何与光栅化阶段(18.4.3–18.4.4 节)

  • 第 16 章的网格存储、简化和顶点压缩,以及第 19 章的视锥和遮挡剔除都能减少进入管线的数据;在 CPU 上加入这些大规模技术会彻底改变性能特征,值得尽早尝试;GPU 上可用计算着色器做各种剔除。
  • 光照:是否每个三角形都需要光照?有时纹理或顶点色就够。光源相对几何静止时把漫反射和环境光烘焙为顶点色,或预计算漫反射全局光照存为顶点值或光照贴图。前向渲染中光源数影响几何阶段,可关闭或削减局部光,改用环境贴图。
  • 封闭物体和永远不会露出背面的物体(如房间墙壁背面)开启背面剔除,约减少一半需光栅化的三角形,像素着色贵时收益更大。

像素着色与占用率(18.4.5 节)

  • 例外情况:顶点总要处理,即使最后不产生可见像素;剔除不力时顶点着色可能超过像素着色。三角形太小时不仅增加顶点着色,还产生更多部分覆盖的 quad。
  • 更重要的是:只覆盖几个像素的带纹理网格线程占用率往往很低,GPU 靠切换到其他片元来隐藏纹理采样延迟,占用率低则隐藏不好;寄存器用量大的复杂着色器也会降低占用率(寄存器压力);频繁切换 warp 还可能增加缓存未命中(见 GPU 并行架构)。
  • 纹理:使用 GPU 内部原生的纹理和像素格式避免转换;只加载需要的 mip 层;纹理压缩既省内存与传输,又让同样大小的缓存容纳更多像素。
  • 着色器 LOD:按距离使用不同像素着色器,例如三个飞碟中只有最近的用精细凹凸贴图,最远的简化或去掉高光,既省计算又减少欠采样造成的"萤火虫"闪烁;简化模型用顶点色还能省掉纹理切换。

过度绘制与深度复杂度

  • early-z 在像素着色前比较深度,不可见片元直接丢弃;但像素着色器修改深度会使 early-z 失效。
  • 深度复杂度:覆盖一个像素的表面数。可视化方法:关闭 z-buffer,混合设为 glBlendFunc(GL_ONE, GL_ONE),清屏为黑,所有物体用颜色 (1/255,1/255,1/255)(1/255,1/255,1/255) 绘制,每层加一级亮度。再开启 z-buffer 渲染一次可得到像素着色器实际调用次数。
  • 随机顺序的不透明三角形覆盖一个像素时,平均绘制次数为调和级数: H(n)=1+12+13+⋯+1n,lim⁡n→∞H(n)=ln⁡n+γH(n)=1+\frac12+\frac13+\dots+\frac1n,\qquad \lim_{n\to\infty}H(n)=\ln n+\gamma γ=0.57721…\gamma=0.57721\dots 为 Euler-Mascheroni 常数。理由:第二个三角形有一半概率在前,第三个有三分之一概率最前,依此类推。深度复杂度 4 平均 2.08 次,11 为 3.02 次,而要 12,367 才达到 10.00 次——过度绘制在深度复杂度低时增长很快,随后迅速趋缓,没有看上去那么糟。
  • 减少过度绘制:
    • 不透明物体大致从前往后排序(按质心沿视线距离;已有包围体层次时先遍历较近的子节点),后画的被遮挡物体不写颜色和深度,还可能被遮挡剔除硬件在像素着色前拒绝。
    • z-prepass:先只把几何画进 z-buffer,再正常渲染整个场景,消除所有过度绘制的着色,代价是多一遍几何。Pettineo 团队用它主要就是为了避免过度绘制;但粗略从前往后排序可能已获得大部分收益;折中是只先画少数大而简单、收益最大的遮挡体;McGuire 发现完整预 pass 对他的系统没有帮助。只有测量才能知道。
    • 延迟渲染和光线追踪的优点之一是在可见性全部确定后才着色。
    • 与按状态排序冲突时,用排序键折中(见 绘制调用与状态切换优化)。

帧缓冲技术(18.4.6 节)

  • 缩小每像素存储以减轻缓存层次压力:精度够用时用 8 位而非 16 位浮点通道。
  • 色度子采样:人眼对亮度比对色度敏感,JPEG、MPEG 都对色度子采样;Frostbite 用它降低 16 位/通道图像后处理的带宽。
  • YCoCg 棋盘 (Mavridis & Papaioannou):光栅化时每个像素存亮度 YY 和交替的 CoCo 或 CgCg 之一(棋盘排列),不需要 A 时颜色缓冲减半,性能常有提升。显示前需重建:缺 CoCo 的像素用四邻域加权, Co=∑i=03wiCoi,wi=1−step⁡(t−∣Li−L∣)Co=\sum_{i=0}^{3}w_iCo_i,\qquad w_i=1-\operatorname{step}(t-|L_i-L|) 其中 CoiCo_i、LiL_i 为左右上下邻像素的值,LL 为本像素亮度,tt 为边缘阈值(原文取 30/25530/255),step⁡(x)\operatorname{step}(x) 在 x<0x<0 时为 0、否则为 1。书中说明权重为 0 或 1,亮度梯度 ∣Li−L∣|L_i-L| 大于 tt 时为 0(权重的归一化在提取文本中未写明),比简单平均四邻值更能保住边缘。
  • 棋盘渲染:分辨率持续上升,多款系统以棋盘模式渲染以节省着色;VR 中 Vlachos 在视野边缘用棋盘,也有把每个 2×2 quad 缩减为 1–3 个样本的做法。

合并阶段(18.4.7 节)

  • 只在需要时开混合:理论上不透明物体也能用 over 合成,但比 replace 贵,值得区分镂空纹理和透明材质。有些操作免费:部分系统上 8 位模板与 24 位深度存于同一个字,使用 z-buffer 时访问模板不增加时间。
  • GPU 有快速清除机制,建议总是同时清除颜色和深度缓冲,能提高这些缓冲的内存传输效率。
  • 尽量避免把渲染目标回读到 CPU:任何 CPU 访问帧缓冲都会冲刷整条 GPU 管线,丧失并行。
  • 合并阶段确为瓶颈时:考虑更低精度或压缩的输出目标、重排算法、缓存复用未移动的阴影部分。也要警惕反复优化一个算法,而换一种技术可能更好。
  1. realtime_rendering_4ed.pdf 第 18 章 Pipeline Optimization

相关页面

图形学渲染瓶颈定位与性能度量Bottleneck Location & Performance Measurement渲染管线中最慢的阶段(瓶颈)决定整体吞吐量。优化就是"找到瓶颈 → 优化到瓶颈转移 → 重复",并让非瓶颈阶段做到与瓶颈同样多的工作以换取画质。定位靠逐阶段增减负载的实验和性能工具;度量要用毫秒帧时间而不是 FPS。两条箴言:了解你的架构 (KNOW YOUR ARCHITECTURE);测量、测量、再测量。图形学绘制调用与状态切换优化Draw Calls & State Change Optimization调用图形 API 的开销主要在 CPU 端的驱动里:状态切换昂贵,每次绘制调用有固定开销,大量小批次会让 GPU"饿死"。对策是:合理放置缓冲;按状态代价排序分组;共享纹理和着色器;合并网格和实例化以减少调用;并用一个整数排序键同时兼顾状态分组与前后排序。图形学深度缓冲Z-Buffer深度缓冲是几乎所有图形硬件用来解决可见性的算法:为每个像素存一个当前最近图元的深度值,新片元更近才写入颜色和深度。它简单、和图元数量成线性关系、允许大多数图元以任意顺序绘制,但不能直接处理半透明。图形学合并阶段与帧缓冲Merging & Framebuffer合并阶段把像素着色算出的片元颜色和缓冲区里已有的颜色结合起来,同时负责深度测试、模板测试和混合。它通常不可编程但高度可配置,也叫 ROP(光栅操作或渲染输出单元)。帧缓冲是系统中所有缓冲区的总称。图形学GPU 并行架构GPU Parallel ArchitectureGPU 为吞吐量而设计:芯片大部分面积是成千上万个着色器核心,而不是缓存和控制逻辑。它靠在大量线程组 (warp/wavefront) 之间快速切换来隐藏访存延迟,用 SIMD 让一组线程锁步执行同一条指令。理解占用率和线程分歧,是写出高效着色器的关键。图形学纹理压缩Texture Compression固定码率纹理压缩由 GPU 实时解码:减少显存占用、增大有效缓存、降低访问带宽,也能在同样内存下用更大纹理。BC (DXTC) 系列是桌面标准,ETC/EAC、PVRTC、ASTC 用于移动平台。它们都是有损的,压缩慢、解压快;法线贴图需要专门处理。图形学色度学与色彩空间Colorimetry & Color Spaces色度学研究光谱功率分布与颜色感知的关系。人眼只有三种视锥细胞,所以三个数就能精确表示任意颜色刺激;CIE XYZ 是标准的三刺激值空间,各种 RGB 色彩空间由三原色和白点定义,可用 3×3 矩阵互相转换。实时渲染用 RGB 而非光谱计算,严格说是范畴错误,但对非预测性渲染效果出奇地好。图形学遮挡剔除Occlusion Culling遮挡剔除尽早剔除被其他物体挡住的物体,避免它们在 z-buffer 中被光栅化、深度比较甚至着色。本页覆盖遮挡剔除的分类与通用框架、GPU 遮挡查询、层次 Z 缓冲 (HZB) 及其在现代引擎中的简化变体(含两遍法、软件光栅化遮挡),以及在 CPU/GPU 上按物体—簇—三角形多粒度组合剔除并用间接绘制提交的剔除系统。图形学延迟着色Deferred Shading延迟着色先用一遍几何 pass 把所有可见表面的材质参数写入多张渲染目标(G-buffer),再以后处理方式对这些存储值逐光源计算光照,从而把"几何可见性"与"光照"彻底解耦,并把材质与光源分离。它避免了着色的过度绘制、简化了着色器管理、天然适合贴花,但 G-buffer 占用显存和带宽,且难以直接支持透明和 MSAA。本页也覆盖前向渲染下限制光源影响范围的基础手段与"光照预通道 (light prepass)"类混合方案。图形学分块着色Tiled Shading分块着色把屏幕划分为瓦片(如 32×32 像素),先为每个瓦片建立可能影响它的光源列表,着色时每个像素在一次着色器调用中只遍历所在瓦片的列表。它可用于延迟着色(tiled deferred),也可用于前向着色(tiled forward,又称 Forward+)。配合 z-prepass 得到的瓦片深度范围可进一步剔除光源,但深度不连续会削弱效果,于是出现 HalfZ、2.5D 剔除等改进。图形学VR 立体渲染优化VR Stereo Rendering OptimizationVR 每帧要为两只眼渲染,并经合成器做镜头畸变与色差校正。本页讲厂商 SDK/API 的帧流程与内建优化(分层合成、隐藏区域网格、裁剪过的畸变网格),立体渲染如何避免工作量翻倍(合并视锥剔除、实例化、多视图扩展、多 GPU 广播、远景单目渲染),以及利用光学和人眼特性减少外围像素着色的技术:多分辨率着色、镜头匹配着色、径向密度遮罩、固定注视点渲染与注视点渲染。图形学GPU 内存、缓冲压缩与多重缓冲GPU Memory, Buffer Compression & Multiple Buffering带宽是稀缺资源。GPU 通过独立显存或统一内存架构 (UMA)、多级缓存与按瓦片存储提高局部性,并用基于瓦片表的无损压缩和快速清除减少渲染目标的带宽(注意:无损压缩只省带宽,不省内存)。颜色缓冲有高彩、真彩、深色三种模式;显示控制器以固定刷新率或 FreeSync/G-sync 自适应同步把颜色缓冲送到显示器;单/双/三缓冲在撕裂、等待与延迟之间取舍。图形学硬件深度剔除与纹理单元Hardware Depth Culling & Texture UnitsGPU 的深度管线先在瓦片级用 HiZ 单元做 zmax/zmin 粗剔除,再逐采样做 early-z 深度测试以免执行被遮挡片元的像素着色器,必要时退回到着色后的 late depth test;深度缓冲同样有瓦片压缩与快速清除。纹理单元以固定功能硬件完成寻址、过滤、钳位与解压(比软件快可达 40 倍),按 quad 有限差分求导数以选择 LOD,并依靠瓦片化/Morton 交织存储和纹理缓存提高局部性。综合帧时间预算与渲染性能Frame Budget & Rendering Performance本页把 wiki 中分散在 RTR4 第 18~23 章的性能知识串成一条线:一帧的时间预算由最慢的管线阶段决定,先用毫秒帧时间度量并定位瓶颈,再按瓶颈所在位置——CPU/驱动、几何、像素、带宽/内存——选用对应手段;最后从 GPU 硬件机制(占用率、HiZ/early-z、压缩、分块架构)理解这些手段为何有效。各结论的细节与出处见所链接的概念页。图形学GPU 计算调度与占用率GPU Compute Scheduling & OccupancyGPU 用大量统一的 ALU 以 SIMD/SIMT 方式锁步执行着色程序,ALU 与寄存器文件、L1、本地数据存储、纹理单元等组成多处理器 (MP),由硬件 warp 调度器零开销地切换 warp 以隐藏纹理和内存访问的长延迟。能同时驻留的 warp 数受寄存器等资源限制,用占用率衡量;占用率低会妨碍延迟隐藏,但过高也可能抖动缓存。本页还讨论像素按 quad 调度和 GPU→CPU 回读延迟。游戏开发 · UE5移动端渲染优化Mobile Rendering Optimization移动端优化的核心是认清设备的 CPU/GPU 速度、线程、带宽和内存,然后控制最主要的几项开销:Draw Call(官方称其为当前导致图形性能低下的最大因素,在 Galaxy Tab S6 上建议约 700 个,低端设备少于 500 个)、材质复杂度和 overdraw。合并网格和材质(Substance 把多种材质画进同一张纹理,用顶点色作遮罩)是减少 Draw Call 最直接的办法。

输入关键词开始搜索

滚轮或双指缩放 · 拖动平移 · 双击放大 / 还原