GAMES104-1&2:课程介绍、游戏引擎的层级
前言
GAMES104-1:介绍
GAMES104-2:游戏引擎的层级结构
这节课介绍了什么
- 游戏引擎的基础结构:有几层结构?为什么要这样做?
- 渲染:我们拿模型、材质、光照、渲染管线……去干些什么?
- 动画
- 物理
- 游戏逻辑(Gameplay)
- 其它:特效、寻路、镜头
- 工具集:C++ Reflection
- 在线游戏
- 前沿技术
游戏引擎的结构
由上而下,我们可以简单做如下分层:
- 工具层:使用引擎的时候,我们就在不断调用各种编辑器:动画编辑器、关卡编辑器、资源管理器……
- 功能层:物理计算、动画计算、渲染、脚本、镜头、输入……让游戏能看得见、动起来、可以玩
- 资源层:数据与资源的加载处理。
不同的资源格式不同需要统一、存储方式对于游戏引擎并不一定是最高效的
- 核心层:内存管理、线程、进程处理
- 平台层:OS差异、输入设备、发行平台、图像API……
第三方库、中间件:在每一层都有不同的专精工具,它们如何与游戏引擎配合交流?
以制作一个动画系统为例
资源层的工作:由资源到资产
-
将资源(resource)转化为资产(asset),舍弃不需要的信息,转化为适合机器处理的格式。
例如,分层信息、压缩算法导致的不高效
-
GUID:每个资产一个有唯一的身份识别
-
管理资产的生命周期:不断的加载与卸载、GC
功能层的工作:Tick
让游戏活起来:每一次 tick 计算逻辑和渲染。
- 逻辑:A 有没有打中 B ?A 要不要向前运动 x 米?
- 渲染:光照、shader……
功能的多线程问题:
- 早期:固定数个线程
- 现代主流:Thread Fork。例如 animation、物理等比较并行的东西用不同线程。
- 更好:Job system。分为不同的原子任务给任何有空的核心,但是难点是同步。
核心层
-
数学库
引擎中相对于精度,更注重速度
-
数据结构与容器:默认的结构可能不适合游戏。
例如,c++ vector 容量不够是按倍数扩张
-
内存管理:宗旨:尽可能放在一起、尽可能顺序访问、尽可能按块读写管理
平台层
- 其他部分的逻辑应该平台无关
- 平台差异
- 图形API:DX11、DX12、Vulkan
- 硬件不同、甚至文件路径的标记格式
工具层
- 可用性:让创作者简单地创造
- DCC(Digital content creation):不同的内外编辑器数据导入导出
为什么要分层
封装解耦:每一层都不需要关心其他层是怎么做事的。只要负责接收处理就好了。
这种解耦的思想在开发过程中时常遇见,分层、接口、消息广播……因为我们总是倾向于各司其职,而不是为了一件小事让所有人大动干戈。