游戏引擎是一个庞大的软件系统,也是最接近操作系统的大型软件,因此涉及到非常复杂的架构设计、资源管理和代码实现。 本节我们简单研究一下游戏引擎所必需的几个重要模块及其功能,了解游戏引擎的宏观分层架构。
1 游戏引擎分层架构
现代游戏引擎的架构极其复杂,如下图:
但大致可以分为以下几个层次:
当然,游戏引擎架构并没有那么简单,但是概括起来也可以认为是由这几个部分组成的。 分层架构的设计要求上层必须调用下层的功能,易于开发和管理。 接下来,我们将详细了解重要的模块。
2 资源层
游戏开发需要利用各种资源来实现目标,而各种资源有不同的格式。 即使是同一类型的资源,其格式也不同。 例如,不同的3D建模软件导出的模型有不同的格式。 由于这样的格式差异,资源层需要将这些不同的资源统一转换为游戏引擎使用的格式。 转换后的资源称为资产。 从资源到资产的过程可以认为是一个净化资源文件的过程。 这个过程会去除游戏引擎不需要的信息,比如3D模型中的编辑信息,只保留游戏引擎需要的信息,并组织成统一的格式。
另外材质材料,资源层还必须对大量的资源进行合理的管理,包括每个资源的唯一标识符(GUID)、不同资源之间的关系、资源的生命周期等。资源的高效管理是资源高效管理的基础。游戏稳定运行。 例如,切换游戏场景时,需要卸载大量资源,然后再加载。 如果资源管理做得不好,加载时间就会很长,影响游戏体验,重则出现问题。 口吃甚至崩溃。
3个功能层
从某种程度上来说,功能层是游戏引擎的核心部分,因为它实现了让游戏成为游戏的所有重要功能,包括渲染、物理、动画、音效、网络、游戏玩法等。 因此,功能层也是构建游戏世界的核心。
游戏世界由 Tick 驱动。 就像秒针一走,我们的世界就会改变。 在游戏世界中,每当“秒针”移动时,我们的计算机就会运行所有函数来计算这一秒游戏世界中发生的事情。 因此,在游戏引擎代码中,入口是Tick:
Ticks一般分为逻辑Ticks和渲染Ticks。 逻辑Tick负责计算相机、运动、动画、物理等函数游戏引擎架构 pdf,相当于构建了整个游戏世界; 渲染Tick负责将游戏世界呈现给玩家,包括剔除、渲染、后处理等。 因此,在每个Tick中,先计算逻辑Tick,然后计算渲染Tick。
功能层的很多功能可以在游戏中实现,也可以在游戏引擎中实现,这完全取决于需求。 对于一些通用的商业引擎来说游戏素材,它们可能会用来制作各种类型的游戏游戏引擎架构 pdf,因此功能层提供的功能应该尽可能丰富。 对于一些专用引擎,如Frost、RED ENGINE等,它们是用来制作特定类型的游戏,因此会在功能层实现特定的功能,而舍弃一些不必要的功能。 功能。
4核心层
核心层为上层实现提供核心驱动。 包括数学计算、数据结构、内存管理、线程管理等基础代码将在核心层实现。 这部分必须保证绝对的安全、稳定、高效。 因此,对编码的要求也很高,一般核心层的代码不会轻易修改。
数学计算包括一些基本运算的实现,向量、矩阵、四元数、随机数等。游戏中的很多计算可能并不要求结果的绝对精度,而是要求计算的效率。 结果中允许存在一定的错误,因此其实现与C++提供的数学库完全不同。
数据结构也是如此。 STL提供的各种数据结构和容器实现有时可能在内存和效率上无法满足游戏的要求。 例如,C++11中的向量在扩展时可能会导致大量的空间碎片。 因此,我们需要实现更高效的数据结构和容器,以及更严格的内存管理,供上层使用。
5 平台层
平台层需要处理不同软硬件平台之间的差异,使得游戏和引擎可以在不同平台上运行。 平台之间的差异听起来很简单,但实际情况却非常复杂。 例如,图形API之间的差异,如DirectX 11、OpenGL、Vulkan等图形接口,差异很大。 即使是同为微软的DirectX 11和DirectX 12也有着完全不同的实现框架,不同的显卡架构也完全不同。 因此,需要一个统一的渲染接口来统一这些差异,让上层用户只需要关注功能实现,而不需要关注底层接口和硬件。 之间的差异。
此外,平台差异还包括核心处理器架构的差异。 PS、XBox、PC等平台的核心处理架构设计完全不同,需要处理这种差异; 游戏输入设备之间也存在差异。 差异包括键盘和鼠标、控制器、方向盘、传感器等,需要一个统一的接口来处理这些设备的输入,使它们能够得到相同的响应效果。
6 总结
总而言之,游戏引擎架构极其复杂,但简而言之,它是由分层架构构建而成,只允许上层函数调用下层函数,不允许下层函数调用上层函数。级别功能。 下层的功能更稳定,上层的功能更灵活。
游戏世界由 Tick 驱动。 每个Tick都会计算逻辑函数和渲染函数,从而构建、运行整个游戏世界并将其呈现给玩家。