Games104 Notes

Posted by Caroline飘小蝎 on August 29, 2024

Chapter0 导语 Instruction

游戏引擎的运用:虚拟人技术(MetaHuman);影视行业;模拟;数字孪生

游戏引擎历史:约翰·卡马克(John D. Carmack II)

常见的游戏引擎

1

常见的引擎中间件

2

Chapter1 游戏引擎基础构建 Basic Game Engine Architecture

3

引擎分层架构的意义:

  • 低耦合、减少复杂度:下层相对于上层独立,对上层提供接口
  • 处理迭代需求:上层更加灵活快速,下层更加稳定

工具层(Tool Layer)

游戏引擎的最上层,用于编辑游戏

基于引擎代码创建编辑器,可用多种编程语言,资源生产工具(DCC)资产的导入导出器

功能层(Function Layer)

引擎模块:动画、物理、碰撞、渲染、AI、交互、脚本、状态机…

TickTickLogic + TickRender

多线程架构已经成为主流

4

资源层(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

6

UE引擎中的UObject并不是GO,而GO更像是Actor的概念

Component-Based Tick:将每个Module都Tick一遍,例如Logic、Input、Camera、Motor、Animation、Physics等

交互方式:SendMessage/Events

7

管理游戏对象

每个GO都有唯一编号(uid)

场景管理:按格子划分,四叉树(Quadtree),八叉树(Octree),层次包围盒(BVH)

其它复杂情况

在引擎中,时序是非常重要的。对象在当前帧还是下一帧收到消息,收到消息后当场反应还是在下一个tick反应,这些都是非常重要的。

8

游戏中的精彩回放并不是录制了游戏内容,而是记住了所有人的输入然后重新把游戏跑了一遍

Chapter3 渲染 Rendering

理论计算机图形学:

  • Realtime(30FPS)
  • Interactive(10FPS)
  • Offline rendering
  • Out-of-core rendering

游戏中的绘制系统面临的挑战:

  • 大量绘制算法、运算复杂
  • 适配现代硬件 CPU/GPU
  • 保证帧率稳定
  • 计算资源限制 -> profiling

渲染管线

9

详细内容参考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

10

存入Resource Pool,每个Instance通过handle去重用数据

11

可见性裁剪

包围盒:Sphere,AABB,OBB,8-DOP,CONVEX HULL

最常用:BVH

PVS思想:通过portal最多能看见固定的房间

12

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个三角形),这样很多计算是完全一致的

13

Unreal的Nanite可以看作是这一技术更进一步

渲染绘制

核心:光的反射、反弹、吸收…

渲染方程:

14

基础光照解决方案

主光照

  • 方向光(Directional Light):大部分情况
  • 点光源(Point Light),聚光源(Spot Light):特殊情形

环境光:低频漫反射

环境贴图:高频漫反射

布林冯光照材质 = 环境光+漫反射+高光

  • 问题:能量不守恒(不能保证出射能量小于等于入射能量),在Ray-Tracing环境下会出问题

Shadow Map:按照从光照开始的深度渲染

  • 问题:和从相机看过去的采样率不一样,出现自遮挡问题

基于预计算的全局光照

全局光照on&off的区别:

15

利用傅里叶变换、球谐函数

用LightMap思想把整个场景的光照烘培到一张图上

动画 Animation

物理 Physics

游戏性 Gameplay

特效系统 Misc. Systems

工具链 Toolset

网络 Online Gaming

前沿概念 Advanced Technology

Mini Engine - Piccolo

5

Piccolo是Games104示例引擎

  • 编程语言:C/C++
  • 代码组成:~13000行Runtime代码 + ~2000行Editor代码
  • 引擎架构:五层引擎层次,ECS架构
  • 支持平台:Windows,Linux,MacOS

拓展

图灵机

弦论

参考书籍

《Game Engine Architecture》

叶劲峰–游戏程序员开发之路