> 技术文档 > 图形管线与渲染引擎中的C++架构设计:模块化、跨平台与资源驱动实践

图形管线与渲染引擎中的C++架构设计:模块化、跨平台与资源驱动实践

#王者杯·14天创作挑战营·第2期#

图形管线与渲染引擎中的C++架构设计:模块化、跨平台与资源驱动实践


一、引言

在游戏引擎的核心系统中,渲染引擎无疑是最复杂和最性能敏感的模块之一。它负责将游戏世界的所有图形元素最终呈现在屏幕上。

在现代游戏中,渲染系统通常需要具备:

  • 可扩展性强(支持多种材质与后处理管线)
  • 跨平台能力(OpenGL、Vulkan、DirectX、Metal)
  • 高性能(利用 GPU、异步管线、资源复用)
  • 数据驱动(基于 Render Graph 或 Frame Graph)

本篇博客将以 C++ 为基础,探讨如何构建现代化、模块化的渲染系统架构。


二、图形渲染系统结构概览

#mermaid-svg-yzd7B0hZIonv5rTd {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-yzd7B0hZIonv5rTd .error-icon{fill:#552222;}#mermaid-svg-yzd7B0hZIonv5rTd .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-yzd7B0hZIonv5rTd .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-yzd7B0hZIonv5rTd .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-yzd7B0hZIonv5rTd .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-yzd7B0hZIonv5rTd .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-yzd7B0hZIonv5rTd .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-yzd7B0hZIonv5rTd .marker{fill:#333333;stroke:#333333;}#mermaid-svg-yzd7B0hZIonv5rTd .marker.cross{stroke:#333333;}#mermaid-svg-yzd7B0hZIonv5rTd svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-yzd7B0hZIonv5rTd .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-yzd7B0hZIonv5rTd .cluster-label text{fill:#333;}#mermaid-svg-yzd7B0hZIonv5rTd .cluster-label span{color:#333;}#mermaid-svg-yzd7B0hZIonv5rTd .label text,#mermaid-svg-yzd7B0hZIonv5rTd span{fill:#333;color:#333;}#mermaid-svg-yzd7B0hZIonv5rTd .node rect,#mermaid-svg-yzd7B0hZIonv5rTd .node circle,#mermaid-svg-yzd7B0hZIonv5rTd .node ellipse,#mermaid-svg-yzd7B0hZIonv5rTd .node polygon,#mermaid-svg-yzd7B0hZIonv5rTd .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-yzd7B0hZIonv5rTd .node .label{text-align:center;}#mermaid-svg-yzd7B0hZIonv5rTd .node.clickable{cursor:pointer;}#mermaid-svg-yzd7B0hZIonv5rTd .arrowheadPath{fill:#333333;}#mermaid-svg-yzd7B0hZIonv5rTd .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-yzd7B0hZIonv5rTd .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-yzd7B0hZIonv5rTd .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-yzd7B0hZIonv5rTd .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-yzd7B0hZIonv5rTd .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-yzd7B0hZIonv5rTd .cluster text{fill:#333;}#mermaid-svg-yzd7B0hZIonv5rTd .cluster span{color:#333;}#mermaid-svg-yzd7B0hZIonv5rTd div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-yzd7B0hZIonv5rTd :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}Game LogicRender QueueRender GraphDraw Call SubmissionGraphics API WrapperGPU Driver

各部分职责:

  • Render Queue:收集所有需要渲染的元素
  • Render Graph:处理排序、依赖、合批、目标绑定
  • Graphics API:封装 Vulkan/DirectX/OpenGL/Metal
  • GPU Driver:由操作系统提供接口接入硬件

三、模块划分与职责

#mermaid-svg-6H7AwQBjL1EpBa02 {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6H7AwQBjL1EpBa02 .error-icon{fill:#552222;}#mermaid-svg-6H7AwQBjL1EpBa02 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6H7AwQBjL1EpBa02 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-6H7AwQBjL1EpBa02 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6H7AwQBjL1EpBa02 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6H7AwQBjL1EpBa02 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6H7AwQBjL1EpBa02 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6H7AwQBjL1EpBa02 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6H7AwQBjL1EpBa02 .marker.cross{stroke:#333333;}#mermaid-svg-6H7AwQBjL1EpBa02 svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6H7AwQBjL1EpBa02 .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-6H7AwQBjL1EpBa02 .cluster-label text{fill:#333;}#mermaid-svg-6H7AwQBjL1EpBa02 .cluster-label span{color:#333;}#mermaid-svg-6H7AwQBjL1EpBa02 .label text,#mermaid-svg-6H7AwQBjL1EpBa02 span{fill:#333;color:#333;}#mermaid-svg-6H7AwQBjL1EpBa02 .node rect,#mermaid-svg-6H7AwQBjL1EpBa02 .node circle,#mermaid-svg-6H7AwQBjL1EpBa02 .node ellipse,#mermaid-svg-6H7AwQBjL1EpBa02 .node polygon,#mermaid-svg-6H7AwQBjL1EpBa02 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6H7AwQBjL1EpBa02 .node .label{text-align:center;}#mermaid-svg-6H7AwQBjL1EpBa02 .node.clickable{cursor:pointer;}#mermaid-svg-6H7AwQBjL1EpBa02 .arrowheadPath{fill:#333333;}#mermaid-svg-6H7AwQBjL1EpBa02 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-6H7AwQBjL1EpBa02 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-6H7AwQBjL1EpBa02 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-6H7AwQBjL1EpBa02 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-6H7AwQBjL1EpBa02 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-6H7AwQBjL1EpBa02 .cluster text{fill:#333;}#mermaid-svg-6H7AwQBjL1EpBa02 .cluster span{color:#333;}#mermaid-svg-6H7AwQBjL1EpBa02 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-6H7AwQBjL1EpBa02 :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}RendererRenderPipelineMaterialSystemRenderGraphResourceManagerGraphicsAPICamera, LightsShaderBinding, TexturesRenderPass, DependencyMesh, Texture, Shader Loader

模块职责:

模块 职责 Renderer 顶层调度器,管理整个渲染流程 RenderPipeline 组织摄像机、光源、阴影、视口等 MaterialSystem 管理材质资源、Shader 参数绑定 RenderGraph 任务调度与资源依赖管理(如 Forward / Deferred / Shadow / PostProcess) ResourceManager 加载资源、管理内存池、热更新 GraphicsAPI 底层跨平台封装 Vulkan / DirectX / Metal

四、基于 Render Graph 的帧调度设计

为什么使用 Render Graph?

  • 自动处理资源依赖(如 Framebuffer、Texture)
  • 提高性能(合并Pass、避免冗余绑定)
  • 便于多Pass管理(Shadow → GBuffer → Lighting → Bloom)

Render Pass 示例结构:

struct RenderPass { std::string name; std::vector<ResourceID> inputResources; std::vector<ResourceID> outputResources; std::function<void()> execute;};

Graph 构建与调度:

#mermaid-svg-IK0n7f68gBab93DH {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IK0n7f68gBab93DH .error-icon{fill:#552222;}#mermaid-svg-IK0n7f68gBab93DH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-IK0n7f68gBab93DH .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-IK0n7f68gBab93DH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-IK0n7f68gBab93DH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-IK0n7f68gBab93DH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-IK0n7f68gBab93DH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-IK0n7f68gBab93DH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-IK0n7f68gBab93DH .marker.cross{stroke:#333333;}#mermaid-svg-IK0n7f68gBab93DH svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-IK0n7f68gBab93DH .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-IK0n7f68gBab93DH .cluster-label text{fill:#333;}#mermaid-svg-IK0n7f68gBab93DH .cluster-label span{color:#333;}#mermaid-svg-IK0n7f68gBab93DH .label text,#mermaid-svg-IK0n7f68gBab93DH span{fill:#333;color:#333;}#mermaid-svg-IK0n7f68gBab93DH .node rect,#mermaid-svg-IK0n7f68gBab93DH .node circle,#mermaid-svg-IK0n7f68gBab93DH .node ellipse,#mermaid-svg-IK0n7f68gBab93DH .node polygon,#mermaid-svg-IK0n7f68gBab93DH .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-IK0n7f68gBab93DH .node .label{text-align:center;}#mermaid-svg-IK0n7f68gBab93DH .node.clickable{cursor:pointer;}#mermaid-svg-IK0n7f68gBab93DH .arrowheadPath{fill:#333333;}#mermaid-svg-IK0n7f68gBab93DH .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-IK0n7f68gBab93DH .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-IK0n7f68gBab93DH .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-IK0n7f68gBab93DH .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-IK0n7f68gBab93DH .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-IK0n7f68gBab93DH .cluster text{fill:#333;}#mermaid-svg-IK0n7f68gBab93DH .cluster span{color:#333;}#mermaid-svg-IK0n7f68gBab93DH div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-IK0n7f68gBab93DH :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}GBuffer PassLighting PassTonemapping PassBloom PassFinal Composition


五、跨平台图形API封装(Vulkan / DX12 / Metal)

抽象层定义

enum class ShaderStage { Vertex, Fragment, Compute };class GPUBuffer {public: virtual void Upload(void* data, size_t size) = 0;};class GraphicsContext {public: virtual void Draw(Mesh* mesh, Material* mat) = 0;};

Vulkan 与 DX12 封装要点

要素 Vulkan 特性 DX12 特性 命令缓冲区 显式控制,需手动同步 与 Vulkan 类似,使用 Fence 与 Barrier 内存分配 复杂、需使用 VMA 库简化 自定义堆管理,自控更强 DescriptorSet 灵活但配置复杂 Root Signature 更高效,但更死板

六、资源管理:Mesh、Texture 与 Shader 的加载与缓存

资源加载框架:

template<typename ResourceType>class ResourceLoader { std::unordered_map<std::string, std::shared_ptr<ResourceType>> cache;public: std::shared_ptr<ResourceType> Load(const std::string& path) { if (cache.count(path)) return cache[path]; auto res = std::make_shared<ResourceType>(); res->LoadFromFile(path); cache[path] = res; return res; }};

支持异步加载与引用计数

std::future<void> asyncLoad = std::async([=](){ auto tex = resourceManager.Load<Texture>(\"diffuse.jpg\");});

七、性能优化实践

1. 多线程渲染准备(Command Generation)

将对象渲染提交改为任务式并行构建:

#mermaid-svg-tVBQuCkk4P5qKJvs {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-tVBQuCkk4P5qKJvs .error-icon{fill:#552222;}#mermaid-svg-tVBQuCkk4P5qKJvs .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-tVBQuCkk4P5qKJvs .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-tVBQuCkk4P5qKJvs .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-tVBQuCkk4P5qKJvs .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-tVBQuCkk4P5qKJvs .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-tVBQuCkk4P5qKJvs .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-tVBQuCkk4P5qKJvs .marker{fill:#333333;stroke:#333333;}#mermaid-svg-tVBQuCkk4P5qKJvs .marker.cross{stroke:#333333;}#mermaid-svg-tVBQuCkk4P5qKJvs svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-tVBQuCkk4P5qKJvs .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-tVBQuCkk4P5qKJvs .cluster-label text{fill:#333;}#mermaid-svg-tVBQuCkk4P5qKJvs .cluster-label span{color:#333;}#mermaid-svg-tVBQuCkk4P5qKJvs .label text,#mermaid-svg-tVBQuCkk4P5qKJvs span{fill:#333;color:#333;}#mermaid-svg-tVBQuCkk4P5qKJvs .node rect,#mermaid-svg-tVBQuCkk4P5qKJvs .node circle,#mermaid-svg-tVBQuCkk4P5qKJvs .node ellipse,#mermaid-svg-tVBQuCkk4P5qKJvs .node polygon,#mermaid-svg-tVBQuCkk4P5qKJvs .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-tVBQuCkk4P5qKJvs .node .label{text-align:center;}#mermaid-svg-tVBQuCkk4P5qKJvs .node.clickable{cursor:pointer;}#mermaid-svg-tVBQuCkk4P5qKJvs .arrowheadPath{fill:#333333;}#mermaid-svg-tVBQuCkk4P5qKJvs .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-tVBQuCkk4P5qKJvs .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-tVBQuCkk4P5qKJvs .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-tVBQuCkk4P5qKJvs .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-tVBQuCkk4P5qKJvs .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-tVBQuCkk4P5qKJvs .cluster text{fill:#333;}#mermaid-svg-tVBQuCkk4P5qKJvs .cluster span{color:#333;}#mermaid-svg-tVBQuCkk4P5qKJvs div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-tVBQuCkk4P5qKJvs :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}调度调度Main ThreadRenderTask Thread 1RenderTask Thread 2Command Buffer Merge

2. GPU 资源池管理

  • 合并小纹理至大 Atlas
  • 使用统一大 Buffer 做 Mesh 合批
  • Memory Allocator(VMA/Custom)追踪碎片与回收

3. Shader 参数绑定优化(Push Constants + Bindless)

  • 频繁更新使用 Push Constants
  • 使用 descriptor indexing 提高绑定效率

八、后处理系统架构:模块化效果链

#mermaid-svg-lyAYQjrcR2JC7hNb {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-lyAYQjrcR2JC7hNb .error-icon{fill:#552222;}#mermaid-svg-lyAYQjrcR2JC7hNb .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-lyAYQjrcR2JC7hNb .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-lyAYQjrcR2JC7hNb .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-lyAYQjrcR2JC7hNb .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-lyAYQjrcR2JC7hNb .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-lyAYQjrcR2JC7hNb .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-lyAYQjrcR2JC7hNb .marker{fill:#333333;stroke:#333333;}#mermaid-svg-lyAYQjrcR2JC7hNb .marker.cross{stroke:#333333;}#mermaid-svg-lyAYQjrcR2JC7hNb svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-lyAYQjrcR2JC7hNb .label{font-family:\"trebuchet ms\",verdana,arial,sans-serif;color:#333;}#mermaid-svg-lyAYQjrcR2JC7hNb .cluster-label text{fill:#333;}#mermaid-svg-lyAYQjrcR2JC7hNb .cluster-label span{color:#333;}#mermaid-svg-lyAYQjrcR2JC7hNb .label text,#mermaid-svg-lyAYQjrcR2JC7hNb span{fill:#333;color:#333;}#mermaid-svg-lyAYQjrcR2JC7hNb .node rect,#mermaid-svg-lyAYQjrcR2JC7hNb .node circle,#mermaid-svg-lyAYQjrcR2JC7hNb .node ellipse,#mermaid-svg-lyAYQjrcR2JC7hNb .node polygon,#mermaid-svg-lyAYQjrcR2JC7hNb .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-lyAYQjrcR2JC7hNb .node .label{text-align:center;}#mermaid-svg-lyAYQjrcR2JC7hNb .node.clickable{cursor:pointer;}#mermaid-svg-lyAYQjrcR2JC7hNb .arrowheadPath{fill:#333333;}#mermaid-svg-lyAYQjrcR2JC7hNb .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-lyAYQjrcR2JC7hNb .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-lyAYQjrcR2JC7hNb .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-lyAYQjrcR2JC7hNb .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-lyAYQjrcR2JC7hNb .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-lyAYQjrcR2JC7hNb .cluster text{fill:#333;}#mermaid-svg-lyAYQjrcR2JC7hNb .cluster span{color:#333;}#mermaid-svg-lyAYQjrcR2JC7hNb div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-lyAYQjrcR2JC7hNb :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}SceneRenderShadowHDR LightingBloomTonemapUI Overlay

  • 每个模块继承 PostEffect 接口
  • 可自由组合顺序、开关、调节参数
  • 支持 Editor 实时预览与切换

九、实时编辑与调试工具集成

  • 使用 ImGui 构建渲染调试界面
  • 显示 GBuffer、光照纹理、材质缓存
  • Frame Time、Draw Call 数量、Batching 统计

十、完整渲染流程回顾图

#mermaid-svg-5ZMLl2BbxD1uEKtH {font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5ZMLl2BbxD1uEKtH .error-icon{fill:#552222;}#mermaid-svg-5ZMLl2BbxD1uEKtH .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5ZMLl2BbxD1uEKtH .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-5ZMLl2BbxD1uEKtH .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5ZMLl2BbxD1uEKtH .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5ZMLl2BbxD1uEKtH .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5ZMLl2BbxD1uEKtH .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5ZMLl2BbxD1uEKtH .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5ZMLl2BbxD1uEKtH .marker.cross{stroke:#333333;}#mermaid-svg-5ZMLl2BbxD1uEKtH svg{font-family:\"trebuchet ms\",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5ZMLl2BbxD1uEKtH .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-5ZMLl2BbxD1uEKtH text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-5ZMLl2BbxD1uEKtH .actor-line{stroke:grey;}#mermaid-svg-5ZMLl2BbxD1uEKtH .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-5ZMLl2BbxD1uEKtH .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-5ZMLl2BbxD1uEKtH #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-5ZMLl2BbxD1uEKtH .sequenceNumber{fill:white;}#mermaid-svg-5ZMLl2BbxD1uEKtH #sequencenumber{fill:#333;}#mermaid-svg-5ZMLl2BbxD1uEKtH #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-5ZMLl2BbxD1uEKtH .messageText{fill:#333;stroke:#333;}#mermaid-svg-5ZMLl2BbxD1uEKtH .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-5ZMLl2BbxD1uEKtH .labelText,#mermaid-svg-5ZMLl2BbxD1uEKtH .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-5ZMLl2BbxD1uEKtH .loopText,#mermaid-svg-5ZMLl2BbxD1uEKtH .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-5ZMLl2BbxD1uEKtH .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-5ZMLl2BbxD1uEKtH .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-5ZMLl2BbxD1uEKtH .noteText,#mermaid-svg-5ZMLl2BbxD1uEKtH .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-5ZMLl2BbxD1uEKtH .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-5ZMLl2BbxD1uEKtH .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-5ZMLl2BbxD1uEKtH .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-5ZMLl2BbxD1uEKtH .actorPopupMenu{position:absolute;}#mermaid-svg-5ZMLl2BbxD1uEKtH .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-5ZMLl2BbxD1uEKtH .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-5ZMLl2BbxD1uEKtH .actor-man circle,#mermaid-svg-5ZMLl2BbxD1uEKtH line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-5ZMLl2BbxD1uEKtH :root{--mermaid-font-family:\"trebuchet ms\",verdana,arial,sans-serif;}GameLogicRendererRenderGraphGraphicsAPIGPU提交场景数据构建 Render Pass 图发起绘制命令提交指令缓冲完成渲染GameLogicRendererRenderGraphGraphicsAPIGPU


十一、总结

本篇系统讲解了 C++ 渲染引擎架构的模块划分、图形管线设计、Render Graph 调度、跨平台封装与性能优化方法。在复杂的游戏图形体系中,良好的架构能极大提升效率与扩展能力。

刀友网