Chapter0 导语 Instruction
游戏引擎的运用:虚拟人技术(MetaHuman);影视行业;模拟;数字孪生
游戏引擎历史:约翰·卡马克(John D. Carmack II)
常见的游戏引擎
常见的引擎中间件
Chapter1 游戏引擎基础构建 Basic Game Engine Architecture
引擎分层架构的意义:
- 低耦合、减少复杂度:下层相对于上层独立,对上层提供接口
- 处理迭代需求:上层更加灵活快速,下层更加稳定
工具层(Tool Layer)
游戏引擎的最上层,用于编辑游戏
基于引擎代码创建编辑器,可用多种编程语言,资源生产工具(DCC)资产的导入导出器
功能层(Function Layer)
引擎模块:动画、物理、碰撞、渲染、AI、交互、脚本、状态机…
Tick:TickLogic + TickRender
多线程架构已经成为主流
资源层(Resource Layer)
存储数据和文件
获取数据:需要先将数据(Resource)转换为资产(Asset),每个资产有一个唯一识别号(GUID),需要处理资产之间的关联
管理资产和生命周期:加载、卸载资产;资源分配;GC垃圾回收;延迟加载
核心层(Core Layer)
引擎模块管理:处理功能层的依赖关系
数学库:对效率的要求非常高
数据结构:数组,链表,队列,堆,树,图,栈,哈希表…
内存管理:内存池,内存分配,内存对齐,降低失效率
平台层(Platform Layer)
处理各种类型的平台
图形API:渲染硬件接口(RHI)实现,硬件架构(CPU,SPU)
Chapter2 游戏世界构建
现代游戏引擎中所有物体都是GO(Game Object):
- 可交互动态物 Dynamic Game Objects
- 静态物 Static Game Objects
- 环境系统 Environments : 天空,植被,地形
- 其它: 空气墙、检测区域(Trigger Area)
对象组件化 Component Base
UE引擎中的UObject并不是GO,而GO更像是Actor的概念
Component-Based Tick:将每个Module都Tick一遍,例如Logic、Input、Camera、Motor、Animation、Physics等
交互方式:SendMessage/Events
管理游戏对象
每个GO都有唯一编号(uid)
场景管理:按格子划分,四叉树(Quadtree),八叉树(Octree),层次包围盒(BVH)
其它复杂情况
在引擎中,时序是非常重要的。对象在当前帧还是下一帧收到消息,收到消息后当场反应还是在下一个tick反应,这些都是非常重要的。
游戏中的精彩回放并不是录制了游戏内容,而是记住了所有人的输入然后重新把游戏跑了一遍
Chapter3 渲染 Rendering
理论计算机图形学:
- Realtime(30FPS)
- Interactive(10FPS)
- Offline rendering
- Out-of-core rendering
游戏中的绘制系统面临的挑战:
- 大量绘制算法、运算复杂
- 适配现代硬件 CPU/GPU
- 保证帧率稳定
- 计算资源限制 -> profiling
渲染管线
详细内容参考Games101课程
Computation:
- 投影和光栅化 Projection and Rasterization
- 绘制 Shading
- 纹理采样 Texture Sampling
GPU
SMID 和 SMIT
- SMID:单指令多数据数学运算
- SIMT:多线程,多核运算
GPU架构
- GPC (Graphics Processing Cluster):图形处理集群
- SM(Streaming Multiprocessor):流式多处理器
- Texture Unit:纹理处理单元
- CUDA Core:GPU中负责计算的核心单元,做大量数学运算
- Warp:本质是一组线程
- 其它:Tensor Core,RT Core
尽可能保证数据单向传输:CPU送到GPU,不从GPU读数据
缓存Cache
- Cache Hit
- Cache Miss:效率降低
GPU限制和性能
- Memory Bounds
- ALU Bounds
- TMU(Texture Mapping Unit) Bound
- BW(Bandwidth) Bound
可渲染物体
每个顶点需要单独确定法线方向
渲染物体 = Mesh + Texture + Material + Shader
SubMesh:对应自己的纹理、材质、ShaderCode
存入Resource Pool,每个Instance通过handle去重用数据
可见性裁剪
包围盒:Sphere,AABB,OBB,8-DOP,CONVEX HULL
最常用:BVH
PVS思想:通过portal最多能看见固定的房间
GPU Occlusion Culling:通过避免渲染不可见物体,来优化图形渲染性能的技术
纹理压缩
在游戏引擎的绘制系统中,用block-based compression算法进行压缩,常见算法:
- PC:BC7(新) DXTC(旧)
- Mobile:ASTC(新) ETC/PVRTC(旧)
建模工具
建模(Maya,Blender,3d MAX)、雕刻(ZBrush)、扫描、自动生成网格(Houdini,Unreal)
Cluster-Based Mesh Pipeline 将精细的模型分成大小固定的小部分(32/64个三角形),这样很多计算是完全一致的
Unreal的Nanite可以看作是这一技术更进一步
渲染绘制
核心:光的反射、反弹、吸收…
渲染方程:
基础光照解决方案
主光照
- 方向光(Directional Light):大部分情况
- 点光源(Point Light),聚光源(Spot Light):特殊情形
环境光:低频漫反射
环境贴图:高频漫反射
布林冯光照材质 = 环境光+漫反射+高光
- 问题:能量不守恒(不能保证出射能量小于等于入射能量),在Ray-Tracing环境下会出问题
Shadow Map:按照从光照开始的深度渲染
- 问题:和从相机看过去的采样率不一样,出现自遮挡问题
基于预计算的全局光照
全局光照on&off的区别:
利用傅里叶变换、球谐函数
用LightMap思想把整个场景的光照烘培到一张图上
动画 Animation
物理 Physics
游戏性 Gameplay
特效系统 Misc. Systems
工具链 Toolset
网络 Online Gaming
前沿概念 Advanced Technology
Mini Engine - Piccolo
Piccolo是Games104示例引擎
- 编程语言:C/C++
- 代码组成:~13000行Runtime代码 + ~2000行Editor代码
- 引擎架构:五层引擎层次,ECS架构
- 支持平台:Windows,Linux,MacOS
拓展
图灵机
弦论
参考书籍
《Game Engine Architecture》
叶劲峰–游戏程序员开发之路