游戏引擎层级介绍

以制作一个可以动的机器人为例,游戏引擎的层级理解如下:

  1. 首先很容易接触到的是游戏制作者会调用的表层的各个模块,称为工具层(Tool Layer)。
  2. 然后我们会理解这些工具背后的逻辑是什么,使用了什么功能,比如游戏世界怎么变成画面的(渲染功能),人物怎么动起来的等,这就是功能层(Function Layer)。
  3. 再次,所有上述这些肯定都需要首先有东西在那儿,(巧妇难为无米之炊),所以资源层(Resource Layer)也呼之欲出。
  4. 之后,我们会发现很多过程中我们使用的都是一些相同的代码模块(比如容器的创建、内存的管理),于是我们把这些东西成为核心层(Core Layer)。
  5. 抛开这些之外,我们还注意到,游戏还需要一个链接不同平台和输入输出设备的模块来满足不同玩家的需求,所以我们又有处理各个平台的平台层(Platform Layer)。
  6. 在这些之外,我们还有各种第三方支持。

在这里插入图片描述

1 Resource Layer 资源层

主要有以下内容:

1.1 资源的获取和寻找 How to Access My Data

在这里插入图片描述

  1. 转换格式,Resource->Asset
    把原始文件(比如MAYA、3DMAX)转为统一的方便处理的格式,这种格式舍弃了源文件中不需要的部分,转为对引擎更高效的数据。
  2. 关系资产 Composite Asset
    专门设定一种资产,用来表示其他资产的关系,比如记录和表达一个Robot角色相关的贴图、模型等各种Asset之间的关系。
  3. GUID
    对每一个Asset标记一个专属于它的ID,并且不随资产位置等变化而变化,方便寻找。

1.2 实时资产管理 Runtime Asset Manager

主要是指在游戏实时运行时对资产的管理方法,有一个虚拟的文件系统,从其中的路径中读取资产;通过一个handle系统去管理资产寿命和引用。
后续会详细讲

1.3 管理资产生命循环 Manage Asset Life Cycle

资源层的核心即在于管理不同资产的生命周期。
在这里插入图片描述

2 Function Layer 功能层

很重要的概念:Tick。指游戏时间运行的基本单位。
Tick方面有两个重要的内容:Tick Logic(先)、Tick Render(后)
线程的管理也非常重要:
在这里插入图片描述

3 Core Layer 核心层

3.1 数学库 Math Library

游戏引擎中的数学并不复杂,但效率十分关键,所以专门放在核心层。
概念SIMD:将多个计算在一个LU(logit unit?)中进行。

3.2 数据结构和容器

单纯利用c++的数据机构和标准库容器效率不够高(比如vector扩大时申请的内存过大),所以需要重新写一些数据结构和容器。

3.3 内存管理

不同于操作系统的堆栈,游戏引擎申请了一大块内存,并自己管理这块内存。其中,缓存大小很重要:
在这里插入图片描述
内存管理仍遵循图灵机的三定律:

  1. 把数据放在一起
  2. 顺序读取数据
  3. 在分配数据和抹除数据时按块来进行

4 Platform Layer 平台层

旨在无视不同平台区别,实现同样功能。
Render Hardware Interface(RHI)十分重要,主要作用:

  1. 在不同的GPU架构和SDK中传输
  2. 对目标平台自动优化
    具体来说可能利用虚函数等来实现。
    另外,硬件结构也会带来很大挑战(比如PS里PPU、SPU等和PC的CPU非常不同,不同算法放不同核都很讲究)

5 Tool Layer 工具层

核心:让每个人都能做游戏。
除了引擎自己开发出来做游戏的模块,还有Digital Content Creation(DCC)(别人开发的资产生产工具):比如MAYA,3DMAX。这些第三方做的资产和我们自己编辑器做的资产都通过Asset conditioning Pipeline去转变成引擎所需的Asset。这个Pipeline本质上是不同的导入导出器。

6 为什么需要分层

  1. 解耦和降低复杂度
    底层独立于高层、高层不知道底层实施细节。
  2. 对不同的需求负责
    上层对速度要求高、下层对稳定要求高。
Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐