引擎架构分层
June 25, 2023About 5 min
引擎架构分层
现代引擎的五层架构

引擎分层的目的是为了解耦,降低复杂度,让下层独立存在,与上层分开.
越底层的编码越稳定(变化的可能比较小),质量要求越高。越上层的代码越开放,越灵活。

- 以现代城市的分层来类比
Info
在实现某个功能的时候需要考虑它应该在那一层,会带来什么影响
工具层

- 让开发者有效开发游戏,比如地形编辑器,UI编辑器,Shader编辑器

- 允许通过地图编辑器为中心形成一系列的编辑器
- 确保在编辑器看到的东西和游戏中是一样的
- 就是提供各种生产工具
- 核心点是允许别人去创造游戏的内容

- DCC(Digital Content Creation), 指别人开发的资产生产工具,比如3DMax
- 需要把DDC生成的数字资产通过一条管线(Assets Condition Pipeline)变成引擎统一的Asset
- 各种导出器和导入器
功能层

- 让世界能被看得见,动得起来,和参与其中。

- 通过如图所示的时钟周期去控制世界的刷新,也就是通过Tick去管理刷新
- Tick类似于CPU时间片的一个固定时间段
- 如果把现实世界看成一个虚拟世界,那么这个世界的Tick时间我们可以认为是一个普朗克时间
- Tick用于更新虚拟世界上的行为,比如Camera, Render

- TickLogic
- 需要先计算整个世界物理变化,不管看没看见
- TickRender
- 通过摄像机裁剪,把物理世界投影到观察屏上

- 人是通过视觉残留去感知世界

- 功能层和具体的游戏关联到一起

- 利用多核→ 多线程去提高运算速度
- 这个涉及到多线程的平衡负载, 难的地方是job之间的dependence
Info
功能层关注的核心就是Tick
功能层包含的内容很多,所以有效地利用多线程去完成高并发任务是功能层的发展方向
资源层

资源层的功能介绍

- 怎么把资源导入到引擎中?
- 数据格式是多样的。
- 我们需要把资源Resource转换为引擎支持的Asset资产.
这种资源会更高效.
- 游戏引擎中的核心功能就是数据之间的关联
- 定义资源的全局唯一编号 GUID
- 通过GUID去访问压缩包中的资源

- 资产管理器在Runtime中通过handle去管理一个个的资源。

- GC处理不好会影响游戏的性能表现
- 延迟加载
Info
定义数据格式,数据在引擎中怎么呈现,在编辑器中怎么呈现,在文件中怎么呈现。
资源层在游戏中核心功能就是管理资产的生命周期→ 资源的加载和释放。
在做游戏应前先关注资源怎么分配。
核心层

- 像一个工具箱
- 有自己的内存管理,自定义的数据结构和容器,减少产生内存碎片,减少cache miss, 进行内存对齐.

- 数学库是核心层的一个重要组成部分

- 游戏引擎是为效率服务,运算是实时(real time)产生的
- 因为为效率服务,所以很多时候是通过高效算法去获取一个近似解
- 数学库要保持高效率. 通常考虑SIMD指令(多数组单指令)
- 利用CPU的功能一次完成多个运算来提速

- 为上层逻辑提供基础库
- 提供引擎自己的数据结构,确保很少的内存碎片,从而增加内存使用效率

- 游戏引擎会用一个内存池去管理所有核心资源
- 内存管理的要点
- 把数据放到一起
- 访问数据的时候尽可能按顺序访问
- 读写的时候尽可能一起读写

- 代码要求很高,确保它的安全性和效率
平台层

- 不同平台的底层API几乎是不同的

- 文件路径存在不同
- 平台层的本质就是通过代码封装把不同平台的差异度掩盖掉

- RHI→ Render Hardware interface, 重新定义一层Graphic API, 把硬件SDK的区别分装起来
- 上图就展示了通过虚函数扩展的API接口

- PS3的CPU架构, 这里展示了PS3的独特性,它可以把一些运算放到协处理器SPU上加速
- SPU的速度很快,可以直接写到显存上
- 对于引擎架构来讲,要把这种独特性封装到之前的平台层实现就非常麻烦
Pilot 引擎简要介绍


三方库层

- 提供三方库
- 生成引擎支持的资源格式