GAMES104实录 | 引擎架构分层(上)

发布于:2022-11-09 ⋅ 阅读:(12) ⋅ 点赞:(0) ⋅ 评论:(0)

本期为GAMES104《现代游戏引擎:从入门到实践》视频公开课文字实录第4期。本课程由GAMES(图形学与混合现实研讨会)发起,游戏引擎技术专家王希携手游戏引擎一线开发者共同研发。

课程共计22个课时,将介绍现代游戏引擎所涉及的系统架构,技术点,引擎系统相关的知识。为配合学习实践,课程组在 GitHub 上开源了小引擎Piccolo,上线1个月即获得了2900+star, 累计下载量已超过20000+。

以下内容为公开课视频转文字版本,为阅读通顺,有删减

引言

今天,我们开始第二讲:游戏引擎的分层架构。

在上一讲,跟同学们讲了研究现代游戏引擎的重要性,今天的这节课,将会真正进入到游戏引擎的海洋里,去理解它的内核,真正知道它里面有什么东西。

同学们刚开始学习游戏引擎知识的时候,大家的第一个困惑(感受)是什么?

我觉得是一种恐惧感。

当我第一次从学术界走到工业界,看到那么海量的代码,我是很慌的,从哪个文件开始看起来?

*《游戏引擎架构》目录

当时我去找了本《游戏引擎架构》看,很厚的一本1000多页的书,打开的第一个章节叫做引擎介绍……看到的是那么复杂的一个系统,你会无从下手。这其实是所有开始学习游戏引擎的同学们的一个很正常的感觉。

我们对一个事情的认知,一般都是由浅入深,所以先不要着急,我们先用一个最简单的方法浮光掠影地去感受一下,这节课我们对游戏引擎大概有哪些层次先做一个非常快速的浏览。

工具层

我们假设有一个很好学的同学叫小明,他现在要开始学游戏引擎了。

他下载了一个现代的游戏引擎,首先看到的东西是什么呢?

如果不是源代码那是什么呢?

是各种各样的编辑器。

我们在编辑器上设计关卡,做角色,做动画,看上去眼花缭乱,而且编辑器本身的功能也是非常地复杂和丰富,好像感觉这些东西拖拖拽拽,真得能做出一个想要的游戏世界。这其实是大家对游戏引擎最直观的第一印象。

这其实也就接触了引擎最上面的那一层——工具层。

功能层

小明是比较好学的,工具层之后他就会问,这些东西怎么可以动起来?

这时他在想:如果我要做一款游戏的话,首先得能把这东西绘制出来吧,游戏绘制的过程本质上是把一个虚拟的三维世界一帧一帧地转换成二维图像,从三维视角转换成二维图像,这个绘制过程需要有渲染。在这里面,所有的东西都不是静止的,我们可能还需要一些动画让它们动起来。在这个虚拟的三维世界,还要让各个物体间能够碰撞,我们就需要一个有物理(规则)的世界,对不对?

比如,我能一脚把在地上的小石头踢飞,那就需要有一些对于它的物理的表达与计算。我们要做的不仅仅是把一个简单的世界搁在那儿,这个世界是可以玩的,那里有很多NPC,敌人,还有各种各样的游戏规则,那还得有一个脚本,AI,包括状态机等能定义这游戏里面的行为。

作为一个现代商业游戏,肯定需要人机界面的交互,这个东西很容易被大家忽略,但其实非常重要。比如说,我们打游戏最在乎的是什么?我打一个boss,boss的血条还剩多少?这个血条代表的是什么?它跟三维绘制没有关系,它实际上是二维的,它会一直在变。在这里面会发现需要大量的跟游戏相关的这些功能,这些基础服务,我们叫做功能层。

功能层核心做的事情其实非常简单:就是我们能够让这个世界可以被看得见,可以动得起来,而且还可以玩起来。

资源层

基本上小明学到这,他应该已经有感觉了,“嗯,我大概已经知道这个游戏引擎该怎么去做了”,但是,如果再往深处想,小明就会发现另外一个问题:我的游戏不能够仅仅通过很多行代码就让一个引擎跑起来,对不对?

我是有大量的数据和文件的,这些数据和文件来自于Photoshop、3D MAX或者Maya等这些3D建模软件,对吧?

还有比如说声音或者文件的编辑,这么多的图形,几何,声音,甚至视频,还有各种各样的复杂的数据,这些数据在游戏引擎里面是哪一个层来处理呢?我们的资源层就呼之欲出了。这个时候小明就会发现,哦,这些成百上万的数据文件在游戏引擎里面有个专门的层,叫做资源层,负责加载管理这些资源。

所以,在功能层下面就是资源层。资源层可以理解成给功能层提供各种各样的弹药,让它去处理,去生成。如果不能够把这个角色的模型,动画资源放进来,那在游戏引擎里面拿什么东西呈现出来呢?就像一个拍摄电影的导演一样,没有给他剧情,那电影导演他本事再大也拍不出来。所以,资源层是在功能层之下的。

到这儿,基本上我觉得作为一个游戏引擎的开发者,小明可以工作了。

核心层

但是,小明是非常聪明而且好学的,他观察到一个非常有意思的现象:无论在引擎上面写动画系统也好,物理系统也好,或者其他各种各样的系统,它会频繁地调用一些底层的代码。

这里面底层代码看上去都非常简单,比如说最基础的容积创建,内存分配等。

还有比如说,我要开一个线程,线程要管理,好像它既没有出现在功能层,也没有出现在资源层。

很好学的小明这时候就遇到了引擎更核心的一层,我们叫做核心层,核心层你可以理解成一个工具箱。它特别像一把瑞士军刀。你要内存管理,好,我给你内存管理的所有工具,你要各种容器的分配,我给你容器分配的所有工具,你要大量的数学运算,比如线性代数坐标变换,我这边数学模块也给你提供好。其实这些游戏相关的逻辑管理,全部是架在底座上面的。所以,核心层是引擎非常重要的一层。

大家想想看,最底层的内存分配管理我都知道了,再往上,资源文件怎么加载大概也知道了,再往上呢,我做各种各样的动画绘制,这些功能我也都知道了。再然后呢,我再往上做一些编辑器,好像我就能做一个游戏引擎,并加载游戏了。但这个时候,有一层特别容易被大家忽略——平台层。

平台层

做了所有的游戏引擎,包括游戏引擎所生产出来的游戏产品,它最终是要发布给用户的,但用户的设备千千万万,对不对?

你可能用的是PC,他可能用的是Mac。还有的人可能用的是手机,包括Xbox Play Station。而且用户的区别还在于他的输入不一样,有的是用键盘鼠标,有的是用手柄,更丧心病狂的还有人用VR体感操作。

前两天我看老头环,有一个家伙开着那个驾驶方向盘,然后过了那个大黄金树的守卫怪,当时我整个人震撼了,而且他带了个头盔,说明什么?就是无论你使用什么样的输入设备到我的游戏世界里面,都要翻译成统一的语言,这种平台的差异不仅仅是在于硬件设备上的,还包括你软件的发布平台。

举个例子,著名的Steam,是大家最喜闻乐见的游戏获取平台。但是,还有跟他竞争的Epic Game Store(EPS),如果EPS把你的游戏发布给Steam,你的接口收费模型可能就会完全不一样。当然,还有我最喜欢的XGP也是非常好的平台。

所以说在引擎的这一层,就是处理各种各样的平台。

从下到上首先就是平台层,然后上面构建了所有功能处理的内核,就是核心层,然后再往上构建资源层,我们的各种文件可以加载,有了这个平台的东西,所有的数学工具我都有了,我资源也进来了,这个时候我就可以开始做各种各样游戏相关的事情了。这些游戏相关的事情,我还可以提供一个编辑环境,让别人编辑起来,所以上面还有一层工具层,这就是现代引擎最简单的五层架构。

当然,这个是极其简单的,实际上我们还可以分得再细,但是因为不同的流派,分法是不一样的,所以我会推荐同学们用这种简单的方法记住就可以了。

第三方插件

不要忘记在第一讲的时候,我们讲过现在游戏引擎已经非常丰富了,基本上每一件事情都有人会专门做,比如说专门做物理的,像Havok, PhysX就做得非常好。那这个时候,这些第三方的代码也要集成到我们的游戏引擎的生态里面,这里面包括声音,Speedtree,Simplygon。

第三方代码在引擎里面是一个非常特别的存在,它有些代码是通过SDK的形式直接集成到我们的引擎里面去,就是说引擎里面编译的时候,就要把第三方代码编译进去。但是,还有一些第三方库,它实际上是变成了一个独立的工具。它和引擎之间的数据交换,只是通过文件格式进行交换。

我举个例子,比如说像Simplygon,一个非常复杂的几何,比如说几十万个面片,现在游戏是跑不动的,但是我们又想看得特别细怎么办?它可以把你面片做简化,Simplygon这个工具,在外面会有一套让艺术家用,把面片一层层地简化。但是,我们在引擎中其实还可以集成一套。(比如说引擎中有一些特别复杂的东西,我可以实时地做一些简化,这个讲起来比较深,今天不展开)

大家记住这个基本的5+1层次,就涵盖了现代游戏引擎几乎所有的代码和体系。

结语

基本上讲到这儿,我觉得同学们应该都非常聪明,大家就会产生一个强大的自信心,就是说,我明白了,我知道现在的游戏引擎是怎么产生的了,那我是不是就可以开始做游戏引擎呢?

实际上没有那么简单。

我觉得我们的小明,这时候也会非常兴奋,他觉得他知道怎么开始写游戏引擎的代码了。

但是,这件事情可能比大家想象得要复杂一点,这也是我们下一节课的重点,就是真正给大家讲清楚现在游戏引擎的五层架构到底是什么,具体是怎么做的。

且听下回分解。

本文编辑:GAMES104编委会 张嘉瑶

张嘉瑶 | GAMES104共创官 | 阿卜杜拉国王科技大学计算机图形学硕士 

如对本节课有任何问题,欢迎加入我们的社群或给我们发送邮件:

piccolo-gameengine@boomingtech.com

关注我们

GAMES104课程官网

GAMES104课程视频