selfsongs头像
关注

现代游戏引擎学习路线

现代游戏引擎学习路线

现代游戏引擎(如 Unity、Unreal 或者是自研引擎)是一个集图形学、物理学、操作系统、CPU/GPU 硬件、多线程架构、底层数学于一体的“计算机科学工业明珠”。
东西看似无穷无尽,但只要划分好阶段和核心主线,就不会迷失在浩瀚的细节里。

第一阶段:筑基修仙(核心内功)

不要一上来就去读几十万行的现代引擎源码。
先确保底层基础稳固:

  • C++ 极度熟练(工业语言):指针、内存管理(堆与栈、智能指针)、现代 C++ 特性(C++11 到 C++20)、多线程。
  • 3D 图形数学(生存工具):向量点乘/叉乘、矩阵变换(平移/旋转/缩放)、仿射变换、四元数(Quaternion)、投影矩阵(正交/透视变换)、裁剪空间(NDC 坐标)。
  • 经典教材推荐:
    《C++ Primer》或《Effective C++》
    《Mathematics for 3D Game Programming and Computer Graphics》

第二阶段:手艺人(理解现代渲染管线与硬件)

这个阶段的目标是搞清楚:你在 CPU 写的一行代码,究竟是怎么变成屏幕上的一个像素的?

  • 造第一个轮子(软渲染器):用纯 C++,不用任何图形 API,在 CPU 端手写矩阵变换、光栅化(画点、画线、画三角形)、深度测试(Z-Buffer)。完成它之后,你将彻底明白什么是顶点、片元以及光栅化。
  • 掌握一种现代图形 API:推荐从 WebGL 2.0 / OpenGL 4.6 入手(概念相对直观),随后进阶到现代显卡驱动 API(Vulkan / DirectX 12 / WebGPU)。
  • 学习如何创建顶点缓冲区(VBO)、编写 Shader(HLSL/GLSL)
  • 经典教材与网站:
    网站:LearnOpenGL (中文版) —— 图形学入门必看圣经。
    经典课:闫令琪老师的 GAMES101(现代计算机图形学入门)—— 华语图形学最强神课。

第三阶段:造物主(从零手写自己的玩具 3D 引擎)

当你能用 Vulkan/OpenGL 画出一个带光照的模型后,尝试用 C++ 把它封装成一个“引擎”。
在这个过程中,你会接触到引擎的核心架构:

  • 核心模块拆解与实现:
  1. 架构:ECS 架构(Entity-Component-System)或经典的面向对象场景树(Scene Graph)。
  2. 资源管理:如何异步加载、反序列化、缓存一张 PNG 图片或一个 FBX 模型?
  3. 渲染器封装:把底层图形 API 封装成 Renderer,实现全屏后处理(Post-Processing)、天空盒、延迟渲染管线(Deferred Shading)。
  • 经典教材推荐:
    《Game Engine Architecture》(游戏引擎架构,作者 Jason Gregory 是顽皮狗首席程序员)—— 此阶段必看! 它会告诉你现代引擎有哪些庞大的子系统以及它们怎么拼装。

第四阶段:商业引擎逆向与工程进阶(Unity/Unreal)

有了前面的底层认知,再去用或研究商业引擎,你就会有“降维打击”的通透感。

  • Unreal Engine (UE5) 深度钻研:
    阅读 UE 的 UObject 和垃圾回收(GC)源码,看大厂如何扩展 C++。
    研究 UE 的 RDG (Render Dependency Graph,渲染依赖图),看现代引擎如何自动调度 GPU 屏障和显存。
  • Unity (URP/HDRP):
    通过编写自定义的 Scriptable Render Pipeline (SRP),手写渲染管线。
    学习 Unity 的 DOTS(Data-Oriented Technology Stack),理解为什么缓存友好的内存布局对现代 CPU 性能至关重要。

💡 给你的两点核心建议

  1. 不要试图一次性写个完美的引擎。现代引擎是成百上千人写了十几年的产物。你的第一个引擎能“读取一个 3D 模型、带一盏灯、带一个全屏模糊后处理”就已经打败 90% 的人了。
  2. 带着问题去读源码。比如当你疑惑“Unity 是怎么处理法线贴图和普通颜色贴图的?”时,直接去翻 Unity URP 的 Shader 源码(如 Lighting.hlsl),看它是怎么调用 UnpackNormal 的,这比死看书高效百倍。

底层架构 ➔ 图形渲染”通关路线

🛑 第一阶段:底层框架架构(内存、多线程、C++设计)

这个阶段的核心目标是:干掉所有低效的内存碎片和线程锁,追求极致的 CPU 缓存命中率(Cache Locality)和硬件压榨。

1. 内存管理(Memory Management)—— 拒绝 new / delete

游戏引擎为了追求每秒 60 甚至 120 帧,绝对不允许在主循环中直接调用操作系统的 new,因为这会触发系统调用并产生内存碎片。

  • 核心知识:
    线性分配器 (Linear/Arena Allocator):只增不减,每帧结束直接将指针重置为0(极快,适合每帧生成的临时数据)。
    池分配器 (Pool Allocator):专门存放大小固定的对象(如子弹、粒子),通过自由链表(Free List)实现 O(1) 的分配和回收。
    对齐内存 (Memory Alignment):理解 SIMD 优化所需的 16 字节或 64 字节(Cache Line)内存对齐。

  • 🛠️ 练手项目 1:
    手写一个自定义的 MemoryManager,重载 C++ 的 operator new/delete。让你的程序在运行期间,所有对象的分配都在你预先向系统申请的一大块(比如 256MB)连续内存中进行,并统计内存碎片率。

2. 数据驱动架构 (Data-Oriented Design & ECS) —— 压榨 CPU 缓存

传统的面向对象(如每个怪物继承 GameObject,包含一堆虚函数)在现代引擎中被彻底摒弃,因为虚函数表(Vtable)和离散的内存会导致严重的 CPU 缓存缺失 (Cache Miss)。

  • 核心知识:
    ECS 架构 (Entity-Component-System):组件(Component)是纯结构体(POD),在内存中像数组一样连续紧凑排列;系统(System)是一段纯函数,直接遍历数组。
    理解为什么内存连续排列能让 CPU 预取(Prefetch)发挥最大威力。

  • 🛠️ 练手项目 2:
    不依赖任何第三方库,自己用纯 C++ 实现一个微型的 ECS 框架。
    支持 Entity 的创建、Component 的挂载(通过组件数组管理),并编写一个 System 遍历 100,000 个实体,对比它与传统面向对象虚函数遍历的性能差距(你会看到数倍的性能飞跃)。

3. 多线程与任务系统 (Job System) —— 吃满所有核心

现代引擎(如 UE5、Unity DOTS)不再让固定线程死守固定工作,而是采用工作窃取(Work-Stealing)的任务系统。

  • 核心知识:
    线程池、无锁队列(Lock-Free Queue)的设计。
    使用 std::atomic 族(如原子计数器)等实现无锁的多线程同步。
    数据依赖图 (Dependency Graph):确保任务 B 必须在任务 A 完成后才能在多线程中执行。

  • 🛠️ 练手项目 3:
    实现一个基于 Fiber(纤程)或轻量级 Task 的 Job System。
    你可以把一堆计算任务(比如 100 万个质数的计算)切分成 1000 个小 Job 丢进系统,让它自动根据当前 CPU 的核心数跑满所有线程,并支持任务之间的依赖等待。

🎨 第二阶段:图形渲染(Shader、色彩空间、光栅化)

有了上面硬核的内存与多线程基础,你的 CPU 逻辑已经无懈可击了。
现在我们要把数据送到 GPU,或者在 CPU 中模拟 GPU 的行为。

1. 纯 CPU 软件光栅化渲染器(Soft Rasterizer)—— 终极破壁者

这是所有图形学大佬的必经之路。
在不调用 OpenGL/DirectX 的情况下,用 C++ 在屏幕上画出 3D 模型。

  • 核心知识:
    顶点处理:手写矩阵乘法,将模型的 3D 坐标通过顶点变换,一步步转到裁剪空间(NDC 坐标)。
    光栅化(重心坐标算法 Barycentric Coordinates):遍历屏幕像素,判断像素是否在三角形内,并在三角形内部插值 UV、颜色、法线。
    深度测试 (Z-Buffer):解决遮挡问题。

  • 🛠️ 练手项目 4:
    编写一个自己的软渲染器。读取一个包含顶点信息的 .obj 文件,在 CPU 里完成线框模式、彩色插值渲染,并把它输出为一张 TGA 图片或用一个简单的窗口(如 Windows Win32 API / SDL2)实时显示出来。

2. 现代图形 API 与 Shader 编程 —— 硬件加速

这时候你再去用真正的图形 API,就会感觉像回家一样亲切,因为它们干的事和你的软渲染器一模一样,只是换成了硬件执行。

  • 核心知识:
    从 WebGL 2.0 (Web端) 或 OpenGL 4.6 (PC端) 入手,学习 VBO/VAO、Uniform、Texture 采样的硬件映射。
    手写 Shader (GLSL/HLSL):实现基础的 Blinn-Phong 光照模型,进阶到 PBR (基于物理的渲染)。
    色彩空间闭环:在你的 Shader 里严格执行线性工作流。在采样颜色 PNG 时将其解包为线性空间;在最后写入屏幕的 Framebuffer 时,手写或者利用硬件将其压回 sRGB。

  • 🛠️ 练手项目 5:
    利用现代图形 API 实现一个延迟渲染管线 (Deferred Shading)。
    先将物体的颜色、法线、深度信息渲染到多个纹理上(G-Buffer),然后使用我们在前几轮聊到的 1 个全屏大三角形 (Full-screen Quad),在后处理 Shader 中统一计算成百上千盏灯的光照叠加,并加入全局 Gamma 校正。

📚 推荐开源项目与对齐学习

在你手写上述轮子卡壳的时候,不要硬憋,去翻翻这些业界优秀的工业/教学级开源项目:

  1. 参考 ECS 架构:看看 Flecs 或 EnTT (Unity 底层就用了 EnTT 的变体)。看它们是如何通过模板元编程优雅地管理内存块(Archetypes)的。
  2. 参考 Job System:顽皮狗大佬开源的 Taskflow 或 wren,是极好的多线程任务流参考。
  3. 参考软渲染器:著名的 tinyrenderer(GitHub 几万星的神作)。如果你在写软渲染器时矩阵或者光栅化卡住了,看它准没错。

💡 通关建议

先花1到2个月的时间,专门把第一阶段的 Memory Allocator,多线程 Job 系统, ECS 写出来,再开始软渲染器。

转载自 CSDN-专业IT技术社区

原文链接:https://blog.csdn.net/qq_35987777/article/details/162976071

文章来源转载

评论

赞0

评论列表

微信小程序
QQ小程序

关于作者

点赞数:0
关注数:0
粉丝:0
文章:0
关注标签:0
加入于:--