简介
一个游戏引擎是会非常复杂的,面对动辄几十万几百万行的代码往往会无从下手。学习这样一个复杂系统,我们首先要将其抽丝剥茧,将其整体架构搞明白,这样才能更加清晰地学习如何构造游戏引擎。
总体分层
游戏引擎由工具架构和运行时组件组成(Tool+RunTime),继续细分又可以把运行时组件分为4层。故总体是五层架构。
Tool Layer
当我们打开游戏引擎,首先接触到的就是各种各样的编辑器,是我们使用引擎时直接能看到和应用的部分。
Function Layer
工具层主要是用于游戏开发者编辑游戏所用,而如果想要让游戏动起来,则是功能层的任务。功能层是游戏的核心部分,使游戏变得可以可视,可动,可游玩。
Rendering
将3D游戏世界里面的图像绘制到2D的屏幕上面
Animation
使游戏里面的各种角色物品动起来
Physics
使游戏里面的世界有各种符合现实世界物理的效果
Camera,HUD and Input
重要的人机交互界面,是表现游戏内容的重要形式
Script,FSM and AI
脚本,状态机,人工智能,为游戏中的NPC添加丰富的行为
Resource Layer
一个游戏的运行,少不了各种美术,动画,音频资源的参与,对于游戏引擎而言,如果功能层需要通过资源层调用各种游戏资源。资源层的任务,主要是处理为游戏提供的各种资源,将其转换成Function层可以直接使用的资源。
Core Layer
核心层是一个游戏引擎的心脏,功能层想要流畅地运行,就需要游戏引擎有一个强大的核心层。核心层是最核心的代码层,为Function层提供多种多样的方法。
Platform Layer
当今的游戏都有移植到不同的平台的需求。然而对于不同的平台,他们的操作系统,软件甚至硬件架构都不同。如果游戏引擎不能很好的兼容各个平台,那么移植游戏对于游戏开发者而言无异于重做一个新游戏,因此平台层也是游戏引擎极其重要的组成部分。
3rd Party Libraries
很多情况下,游戏开发者对于特殊的功能有着特别的需求,这就需要一些第三方组件的使用。第三方组件是游戏引擎的重要组成部分,提供强大的特定功能。可以插入到游戏引擎的任意一层。
对于一些层实现的具体办法
Resource Layer
资源的导入
引擎化
各种资源的格式都是不同的,而且类似 Maya 的数据,里面有很多引擎不需要的,只是为了方便在 Maya 里操作的信息,因此我们需要一次转换,将这些数据转换成引擎能够使用的高效的数据,成为资产(Asset)。
资源层需要在导入时将原有的文件中的一些有用的内容导入到文件中,而剔除无用的,从而提高引擎处理资源的能力。
资产关联
如对一个可以动起来的模型,其上面的网格,贴图,材质,动画等资源都是关联到一起的,我们可以定义另外一种资产进行管理指定(Composite asset)。
GUID
资源层还会给每个资产一个独特的识别号(GUID)便于查找,防止路径改变后无法识别相关资产。
生命周期
资源层需要负责管理资源的生命周期。
垃圾回收也是重要一环,资源层需要合理加载和卸载资源,防止由于大量的资源操作导致游戏卡顿。
很多游戏中使用的延迟加载也是由资源层控制的,玩家离场景越近,加载的纹理更精致。
Function Layer
tick
每过一个tick要执行一遍要做所有事情。每个游戏引擎都会有一个tick函数,我们可以从tick看起学习游戏引擎是如何运作的。
tick可以被分成两个部分tickLogic and tickRender,先tickLogic再tickRender,要将其分开。
多线程
Fixed Thread
在游戏引擎的初期,会将整个引擎的运行分为三个线程:Logic,Render,Simulation。
Thread Fork/Join
主流引擎中,会把特别容易并行的东西,如物理等,fork出来,分散到别的线程去做
JOB System 不浪费任何资源换的线程调用
未来的引擎中,把任务变成原子的,把每个处理器都吃满。
对于未来的引擎,难点在于不同部分之间的内容通信,和处理的先后顺序处理。
Core Layer
数学库
除了物理以外其他使用大学程度的线性代数就可以解决。
难点在于Real Time,游戏引擎为了在1帧的时间内计算出整个游戏世界的所有内容,需要很高的效率,往往会为了提高效率使用各种邪道方法。
对于游戏引擎中使用的数据结构和各种容器,需要游戏引擎开发者手动实现高效的数据结构,从而得到一系列不会产生内存碎片和效率较高的数据结构
游戏引擎内存处理的三个原则
1.尽可能把要处理的数据放到一起
2.按照数据本身的物理顺序去处理
3.要按照区块的规模处理数据
Platform Layer
无论是面对Windows系统和Mac系统,还是面对DirectX和OpenGL,亦或是硬件层次的差异,都需要游戏引擎强大的平台层兼容。
Tool Layer
工具层是整个游戏引擎中最后实现的一层,也是面对所有开发者的游戏引擎的”面子“。往往在工具层的代码量是最多的,对于一个好的游戏引擎而言,应该可以让任何人都能做游戏!
为什么要分层构造
和现代城市结构相似
封装解耦,每一层只关注自己的事情,减低复杂度;
底层提供基础服务;
顶层不需要知道底层的具体实现;
顶层部分迭代频繁,底层相对稳定;
一般只允许上层调用下层,避免出现循环依赖;
本文内容源自GAMES104_Lecture2所讲内容
本文图片引用GAMES104_Lecture2
欢迎大家学习GAMES104,课程网址:https://games-cn.org/games104
Thanks for reading