Skip to content

引擎与实时渲染学习路线 ​

这条学习路线围绕一个实际问题展开:如何理解并逐步演进一个已有的 Forward Renderer,使它能按场景需要采用 Forward、Forward+、Deferred 或混合路径,并在目标平台上稳定运行。

目标不是一次性读完所有图形学细节,而是建立一张能指导引擎修改的结构图:数据从哪里来,哪些系统消费它,资源如何绑定,Pass 如何组织,性能代价在哪里。

学完后应能解释什么 ​

  • 一帧中 GameObject 如何变成 RenderPacket 和 GPU 命令;
  • Texture、Sampler、Descriptor、Material 分别负责什么;
  • Forward、Forward+、Deferred 和 Hybrid 的数据流与适用条件;
  • RenderGraph 如何从资源读写关系推导 Pass 顺序、Barrier 和临时资源生命周期;
  • 如何在保留现有路径的基础上逐步加入新路径;
  • 如何用 CPU/GPU 时间线、内存带宽和设备能力判断修改是否有效。

学习主线 ​

text
引擎一帧与运行时数据流
        ↓
资源所有权、线程边界与 GPU 生命周期
        ↓
GPU 图形管线与 Shader 输入
        ↓
Texture / Sampler / Descriptor / Material
        ↓
Forward → Forward+ → Deferred → Hybrid
        ↓
RenderGraph、资源状态与同步
        ↓
移动端性能分析与能力分档
        ↓
逐步演进一个现有渲染管线

阶段一:先看清一帧怎么走 ​

**目标:**建立 Game Thread、Render Thread、GPU 之间的数据边界。

先读:

读完应能画出:

text
World 更新 → Render Snapshot → Culling → RenderPacket
          → RenderQueue → Render Pass → Command Buffer → GPU

阶段二:掌握修改引擎时用到的基础能力 ​

**目标:**知道资源由谁持有、何时失效、跨线程如何安全交接。

按需阅读,不要求把所有 C++ 章节背下来:

渲染修改尤其要盯住三类生命周期:CPU 对象、GPU 资源、异步命令。CPU 指针仍有效,不代表 GPU 已经用完对应资源;资源释放和复用需要符合 Fence 与队列完成顺序。

阶段三:从 Shader 和资源绑定理解一次绘制 ​

**目标:**把 Shader 代码里的资源声明和引擎里的资源绑定对应起来。

学习顺序:

  1. Vertex、Rasterization、Fragment、Depth/Blend 等 GPU 阶段;
  2. Mesh、Material、Shader、Pipeline State 如何组成 Draw;
  3. Texture 保存图像数据,Sampler 描述过滤和寻址规则;
  4. Descriptor、Resource View 和 Shader binding 如何让 Shader 找到资源;
  5. MipMap、隐式导数与 Sample、SampleLevel、SampleGrad。

对应文档:

阶段四:理解管线选择与演进 ​

**目标:**能根据光源数量、透明物体、带宽和材质需求选择渲染路径。

建议掌握的比较维度:

维度需要回答的问题
光照光照在哪里计算?大量局部光源的成本如何控制?
带宽与内存是否写入 G-Buffer?每像素需要多少 Render Target?
透明半透明材质如何参与光照和混合?
材质灵活性不同材质能否使用不同 Shader 和渲染路径?
设备能力目标 GPU、图形 API 与内存预算是否支持该路径?
维护成本新增路径后,Shader 变体、Pass 和调试复杂度如何变化?

阶段五:用 RenderGraph 组织 Pass 和资源 ​

**目标:**从“手写调用顺序”转向显式描述 Pass 对资源的读写。

对应内容在图形渲染管线与性能基础的 RenderGraph 章节:Pass、Resource、Usage、Handle、依赖分析、Pass 裁剪、Barrier、生命周期和临时资源复用。

理解顺序:

text
声明每个 Pass 读取什么、写入什么
        ↓
推导 Pass 顺序和资源状态
        ↓
分配或复用临时资源
        ↓
录制并提交 GPU 命令

阶段六:在移动设备上验证 ​

**目标:**用测量结果决定管线是否值得改,并建立设备回退策略。

从性能分析章节开始:

  • iOS:Time Profiler、Allocations、VM Tracker、Metal System Trace、Energy Log;
  • Android:GPU 厂商、OpenGL ES/Vulkan、纹理格式、Shader 精度、Render Target、内存与热降频;
  • 通用:区分 CPU-bound、GPU-bound、带宽受限和同步等待。

每次改动至少记录一个基线和一个结果,例如 CPU/GPU 帧时、Draw Call、带宽、G-Buffer 内存、温度稳定后的帧时间。只看到平均帧率变化不足以定位原因。

阶段七:贯穿全程的演进练习 ​

以一个现有 Forward Renderer 为起点,按小步验证:

  1. 记录当前 CPU/GPU 帧时、Draw Call、材质切换、带宽和目标设备;
  2. 整理 RenderPacket、材质信息和不透明/透明队列边界;
  3. 先评估 Forward+ 光源分桶,确认瓶颈是否来自每像素遍历过多光源;
  4. 若确有收益,再为选定的不透明材质增加 G-Buffer 和 Deferred Lighting;
  5. 透明、粒子及特殊材质继续走 Forward 路径;
  6. 用 RenderGraph 声明资源依赖,并检查状态转换和资源生命周期;
  7. 为低端设备或不支持的格式保留 Forward 回退路径;
  8. 在目标设备上重新测量,比较画质、帧时、内存、带宽和发热。

这组练习不是要求最终一定采用 Deferred。结论可以是保留 Forward、加入 Forward+,或只让少量材质进入 Deferred;选择应由目标负载和设备数据决定。

每轮学习怎么进行 ​

每个主题按同一节奏推进:

  1. 先用一张数据流图说明概念;
  2. 结合一个小例子理解职责和边界;
  3. 用一两个问题确认理解;
  4. 出现卡点时补到对应篇章;
  5. 回到贯穿练习,说明这个概念会影响哪项引擎决策。

这条路线先建立整体认识,再按实际疑问补深度。高级 API 细节、多队列调度和复杂光照算法可以等主流程清楚后再展开。