一、游戏引擎分层架构
0.游戏引擎分层简介
- 用户层
- 工具层(Tool Layer):编辑器、工具界面
- 功能层(Function Layer):渲染Rendering、动画Animation、物理Physics、相机Camera和实现游戏性的脚本Script、状态机FSM、AI等功能模块
- 资源层(Resource Layer):各类图片、动画、音频资源加载
- 核心层(Core Layer):核心功能如内存管理、容器分配、数据计算、多线程处理等
- 平台层(Platform Layer):对接不同游戏平台、主机和硬件
- 第三方库(Third Party Libraries):中间件和第三方库通过SDK(Software Development Kit)调用
1.资源层
- 将资源(resource)转变为资产(asset),比如将各类图片提取有用信息后(比如psd格式里就有很多无用信息)转换为适合GPU处理的DTS格式
- 使用一个Composite asset文件(如XML)定义资源间的关联性,如一个模型的贴图、动画、材质等对应,并使用全局唯一标识符(GUID)进行管理
- 运行游戏时,使用资产管理器(Runtime Asset Manager)管理资产的生命周期(Asset Life Cycle),包括资产的实时加载卸载、资源的分配、垃圾回收(GC)、延时加载等
2.功能层
在一个tick时间内(帧?)分别先后执行tickLogic()和tickRender(),(逻辑帧和渲染帧,类似unity的Update()那一套)
- 逻辑帧执行
- Camera
- Motor
- Controller
- Animation
- Physics
- 渲染帧执行
- RenderCamera
- Culling
- Rendering
- Postprocess
- Present
功能层涉及的东西核心又多且杂,给引擎提供核心功能模块(major function modules)、Loop Update、并且是游戏和引擎的过渡。同时功能层的多线程运算已经成为主流,并且多核中的dependency非常重要。
3.核心层
核心层为所有逻辑提供基础,比如数学库[线性代数就够用]、数据结构和容器(链表树)、内存管理等。
游戏引擎非常注重效率,比如在数学库中,可以使用逼近算法(不完全准确),或者用SIMD(单指令多数据Single Instruction Multiple Data,以同步方式,在同一时间内执行同一条指令)提高计算效率,或者使用SSE指令进行矩阵计算;比如数据结构(比C++)更方便内存管理,以减少内存浪费(这点与操作系统类似)。
- 提升CPU内存效率的三个要点:1,数据集中存放;2,按照顺序结构排序;3,输入输出批处理-----ecs核心思路
- 因此对代码质量要求很高(安全且高效),能写核心层的人可以做初级架构师啦
4.平台层
有时候写完代码发现不同平台文件加载路径的符号都不一样,这时候就需要用到平台层,来消除不同平台间差异的影响。平台层通过Render Hardware Interface(RHI)来解决这些差异问题,利用虚函数对不同平台的图形API进行重新封装。
甚至不同平台连CPU架构都不一样,比如索尼还有个SPU,不同平台的优化差异很大。
5.工具层
工具层主要为创作者提供生产力工具,比如蓝图、材质编辑器、Shader Lab等,引擎追求runtime效率,但工具不需要runtime只需要开发效率,因此可以使用C++、C#甚至h5来制作。
有时候工具层的代码量会比其它层都大的,维护成本也更高,因此一样相当核心。
- Asset Conditioning Pipeline(资源导入导出器)+ 引擎编辑器 = 引擎完整的工具层。
二、为什么分层架构
游戏的复杂度高,技术面广,分层可以使不同模块部分解耦,各自独立提供服务,如同封装的思想(也如同社会结构),底层为上层提供基础服务,上层调用底层的工具,上层灵活,底层稳定。层次之间只允许上层调用下层,稳定清晰。
总结
- 游戏引擎被设计为分层架构,各引擎大同小异,命名不同但分类都有
- 在这一分层架构中,底层为上层提供基础服务,上层调用底层的工具,上层灵活,底层稳定
- 游戏中的虚拟世界由一系列tick时间组成