GAMES104实录 | 游戏引擎导论(中)

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

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

PS:错过了上期内容的同学可以点击下方链接阅读哦。

GAMES104实录 | 游戏引擎导论 -(上)

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

01「游戏引擎的历史」

全球第一款游戏引擎

视频游戏行业的历史非常短,大概只有50多年。行业早期的机器很简陋,这个机器同学们有没有玩过?叫红白机。这里面有很多童年的快乐,比如大家觉得特别经典的魂斗罗、马里奥。

那个时代实际上没有游戏引擎的概念,游戏都非常简单。那时候开发游戏最核心的能力是什么?是如何把一个复杂的元素放到一个非常小(比如40KB)的存储空间里去。

看任天堂的报告,它会告诉你,那时候为了节约资源,比如把白色的云彩变个颜色放到地上,就变成了一片草丛。把一只小乌龟正面反面地来回播放,就变成了它在地上走。

记得在美国工作的时候,有位微软副总裁跑过来做报告,他告诉我们这么一件事,说在加入微软之前,他一年做了四款游戏。当时我们听傻了,因为我们几百人做三年才能做一款3A游戏,那个时代他一个人就能做四款游戏。

为什么?因为那个时代的游戏非常简单。我一直认为那是游戏的黄金年代,大家有很多创意、野蛮生长,就像寒武纪生命大爆发一样,生命会变成各种各样的形态。

第一个提出游戏引擎的是谁?我觉得是约翰·卡马克——传说中的卡神。

我认为他是行业里的教父级人物,直到今天他还在为Facebook的Oculus在努力。

*约翰·卡马克最近宣布成立了一家专注于通用人工智能的新公司Keen Technologies。

我非常崇拜和敬佩他,最近听了一个他讲VR虚拟现实的报告,还是那么谦卑、务实,在讲一些具体东西。

他是个非常睿智的人,在那个时代做了一款叫Wolfenstein(德军总部)的游戏,它非常经典,可以说是开创了FPS时代。

做游戏的时候,我经常跟团队讲,大家千万不要被现成的东西束缚住。比如今天的游戏从业者会说,我要做一款什么什么类型的游戏,但实际上任何一种现在看到的游戏类型,都是被一款产品给创造、定义出来的。我觉得未来世界会有很多新的引擎出来、新的游戏类型出来。

而在那个时代,世界上没有一个物种叫做游戏引擎,但John Carmack看到了一个东西。他说,在写各种各样游戏的时候,有很多代码是可以重用的,这些重复的东西能不能抽出来在产品中共用?要不要把它定义成一个叫做game engine的东西?这位老哥说干就干,接着就做了第二款游戏DOOM,它也是经典中的战斗机,到现在DOOM仍是非常棒的一款射击游戏。

在做DOOM的时候,他把DOOM的核心代码变成了一个游戏引擎,接着他把这个引擎授权给了另外一家公司,这家公司做了一款叫做ShadowCaster(投影者)的游戏,这个游戏居然在商业上成功了。

所以,我们认为卡神的DOOM引擎应该是全球第一款游戏引擎,并且很幸运,第一款引擎在商业上就成功了。

早期的现代游戏引擎

不过这个课程叫什么?叫现代游戏引擎。

早期的游戏引擎只是一些代码的共用,真正的现代游戏引擎概念,我认为还得从Quake时代开始。Quake也是卡神的作品,在那个时代,Quake是最经典的射击对战游戏。

讲一个很有年代感的东西,Quake有个很著名的火箭跳,你可以拿着个RPG对着地上轰,然后反作用力会让你跳得更高。

Quake给我们创造了无数的快乐,并且它是第一款系统研究过联网对战下网络怎么同步的游戏,Quake引擎也是那个时代真正的经典。

为什么会出现质的飞跃?因为一个划时代的东西出来了——显卡。

早期游戏计算机是没有显卡的,直到大家意识到:图形运算和逻辑运算是不一样的,图形运算是大量的向量运算,并且有大量并行化的运算,拿CPU做图形运算会很麻烦。

第一代显卡Voodoo显卡出来了,Quake抓住了这个时代,做了第一代的3D游戏,当时它的画面、沉浸感震撼到了玩家。

直到今天,很多人在讲FPS游戏的时候,会说一个叫做“晕3D”的东西。不知道有多少人是晕3D的?就是打着打着就吐了。如果你想了解什么叫晕3D,强烈推荐Quake,包你当场就吐出来。但是,它确实创造了一个前所未有的体验。

游戏引擎为什么会越来越发达、越来越重要?这里面有个核心的关联度——硬件的发展。我们在思考这个技术平台的driver到底是什么?我一直认为是硬件的发展。

以PlayStation为例,第一代的算力值有多少?只有0.066个GFLOPS,一直到PS2/PS3/PS4,再到现在的PS5,PS5的算力是多少?10个TFLOPS。这意味着算力整整提升了20万倍。

当有了20万倍算力,这意味着什么?很多游戏从业者会说,哇,太棒了,我可以做一个很棒的东西出来了!但从软件工程上来讲,这是一个巨大的挑战。

随着计算机算力越来越丰富、越来越强大,系统就会越来越复杂。所表达的效果、所涵盖的模块就会越来越多,就像最早期操作系统谁都能做,但为什么现代操作系统只有极少数公司才有能力做?那是上亿行的代码。

同样的,游戏引擎也是这样。早期的游戏引擎非常简单,但是现代游戏引擎动辄就是几百万到上千万行代码,而且里面的算法非常复杂。

丰富的现代游戏引擎生态

从九几年开始,经过将近30年的发展,今天我们可以看到一个非常丰富的游戏引擎生态。

大家非常熟悉的虚幻引擎、Unity引擎,还有前些年非常厉害的Crytek引擎(这些年有点掉队),这些都是商业级引擎。

全球的游戏大厂(比如育碧、EA、RAGE)都有自己的游戏引擎,比如大名鼎鼎的寒霜引擎。如果你是一个FPS游戏玩家,一定知道《战地》这款游戏,它那种开阔战场的感觉,就是寒霜引擎巨大能力的表现。

Anvil(铁砧)引擎是育碧做刺客信条的,虽然觉得育碧的游戏有点塑料,但不妨碍它的引擎做得好。《刺客信条》里面一个很著名的案例——巴黎圣母院,一场大火后,我们现在只能在《刺客信条》里面感受和体验巴黎圣母院的盛况了。

Valve的source引擎以及Torque、Armory、Godot这些免费引擎,主要以开发轻量级的休闲游戏为主,就复杂性而言,它们和那些商业引擎、大厂的引擎相比还是有差距的。

随着游戏行业的发展,我们发现引擎(包括引擎内部的有些东西)非常复杂。

早期的游戏运擎会自己写物理模块(比如解算器、物理碰撞检测),但后来这些问题越来越复杂,就会出现专门做物理模块的,我们叫做middleware(中间件)。

中间件包括比如做物理的Havok、PhysX,还有专门做声音的Wwise、fmod。游戏里面的声音效果是非常重要的,玩一个恐怖游戏,走进房间会听到脚步的回声。打仗的时候,一个炮弹在身边爆炸会有耳鸣感。

中间件还包括做自然植被、做光照的,比如大名鼎鼎的Speedtree——做漫山遍野的树木。《阿凡达》里面的茂密葱葱的外星星球,用的就是Speedtree的技术。

多说一句,中间件公司总会不断地爆发出来,但一般生命周期都不长。我们经常说,中间件公司最好的归宿就是被某个游戏/游戏引擎大厂收购。但中间件在整个游戏引擎生态里面是一个非常重要的模块。

02「游戏引擎的定义」

游戏引擎是构建《黑客帝国》矩阵的底层框架。

《黑客帝国》是一部非常经典的20多年前的电影,新作《黑客帝国:矩阵重启》去年也上市了。

《黑客帝国》构建了一个非常伟大的想法:我们是不是生活在一个虚拟世界?今天我们虽然能够感知到彼此,觉得好像生活在一个真实世界,但是,假如我们是缸中之脑呢?

我们通过一系列的传感器和计算机模拟出一切的实际存在,而游戏引擎在过去的30年,做的一切事情都是在模拟一个虚拟世界。未来,当我们戴上VR眼镜、插上耳塞、穿上触感皮肤,我们可能无法区分是生活在一个虚拟世界还是真实世界。而游戏引擎,它所有的软件和体系架构都在为这件事情服务。

游戏引擎是人类创意/想象力的生产力工具。

通过这样一套工具体系,我们可以把想象的世界在虚拟的空间里构建出来。可以构建一个几英里高的巨大建筑物,可以创造一个从来没有存在过的外星星球。

过去我们对这类东西的想象停留在书本、画面或者电影上,但游戏引擎提供了一个工具,让我们可以把这个世界身临其境地创造出来、摆在我们面前。

游戏引擎是一个复杂性的艺术。

当有了这么强大的需求和能力,这个系统绝对不简单,它非常复杂。几乎不存在一个完美精致的引擎架构,它是一系列妥协、一系列决策的结果。

所以我认为游戏引擎是一个复杂性的艺术,我特别喜欢一本书——《复杂之美》,当我们越来越深地去理解游戏引擎,会发现面对的是一个超级复杂的系统。

为什么讲我们在构建这个世界?

十年前讲游戏引擎,我特别喜欢用一张图,这张图展现的是一只吸满血的蚊子。当我们用显微摄像机拍下来,可以看到它那么美,它身体的材质,无数的细节……

今天看到游戏,我们说次时代、说画面无比真实,但和大自然相比,我们还差得很远。

剧透一下,为什么我这么热爱这个事业?记得十年前,看完电影《阿凡达》后特别激动,我和小伙伴们说,十年之内我不会失业。为什么?我们要用十年甚至更久的时间,把那样一个美轮美奂的世界真得通过游戏展示在大家面前,让大家真得在那个世界里面可以交互。

在虚拟世界,一切东西都是用简单的01逻辑表达的。

现代计算机最基础的理论模型是什么?图灵机。图灵机的逻辑是什么?我们大脑所有复杂的运算/决策,图灵老先生在8、90年前就用数学告诉我们:只要有一条无限长的可以打孔的纸带就可以了。有个头、可以读和写,然后按照一定的机械规则去运动,就能完成一个计算。

当然,现代计算机越来越复杂、越来越花哨,但它的本质就是读、写、计算。

用简单的01变化构建一个世界,其实是非常挑战的。

一个简单的两人联网动作游戏。

要把这个人渲染出来、要这个人能动起来,就需要有一个渲染系统、动画系统。这是看得见的,还有很多看不见的系统,比如要定义一个物理碰撞系统,需要知道你打不打得中我。

还有控制系统,因为一切输入都要能进得去。还有更复杂的,网络怎么同步?两个人在两台不同的计算机上,A同学按下一个键,他在自己的世界里就做了一个操作。在另外一个世界,B同学是不是也要看到同样的操作?如果他做了个闪避操作,到底算是闪避成功还是没有成功?

这就是这个系统的复杂度。

科普一个概念,特别希望上GAMES104课程的同学能够建立这个概念:当有人告诉你,我会做很多的Rendering,我就能做游戏引擎了。上完的同学可以说:No,这事没有那么简单!

这是游戏引擎非常经典的一本书——Game Engine Architecture,作者画了一张游戏引擎的结构图。我是图形学科班出身,但很卑微地发现,原来图形学在整个游戏引擎中只占很小的一部分。

我本科、研究生都在研究图形学,那时候觉得自己做图形学还可以,但是没想到做游戏引擎的时候,又整整花了15年学习所有相关的知识体系。

以后有人问,做绘制是不是就能做游戏引擎了?学完GAMES104课程的同学可以很自豪地回答:No,你还要学另外90%的知识。

03「游戏引擎的挑战」

计算机有限的算力

假设我们真实的世界全是虚拟的,那么上帝老人家真的特别厉害:有无限的算力、有无限的存储、没有带宽的延迟、可以采用暴力算法。

对物理学有所了解的话,量子力学最基础的理论是非常简单的,就只有四个基本力,现在好像只有三个了。再往下推,如果弦论靠谱的话,一切都是振荡的弦,通过这些弦的振荡,居然能形成这么丰富多彩的世界和它的意识世界。

上帝有暴力算法,但是很可悲的是:在现代计算机里面,我们是被严格限制住的。

计算机的CPU主频一直在涨,但是这几年涨的速度变慢了,几乎已经到了摩尔定律的上限。硬盘、内存也是有限的,就那么多G。还有一个很可怕的东西叫带宽,同学们在网上下载电影、看视频都会知道带宽是很让人头疼的,每秒钟能传输的东西是有限的。还有一个叫延迟,在A地方发生的事情要传到B地方,这个时间是有延迟的。

有这么多的约束条件,要在计算机里面模拟一个很像真实世界的东西,大家想想看,是不是很难?

核心设计的边界条件——Realtime(实时)

这其实就是游戏引擎的复杂度。而且,更让我们觉得痛苦的,也是游戏引擎的一个核心设计的边界条件——Realtime(实时)。

Realtime是学习游戏引擎特别要记住的一个关键性概念,就是说,无论有多么厉害的算法,能做出多么好的效果,如果不能够在1/30秒(33毫秒)之内把计算结果提交出去,那么这个算法就是无效的。

实际上也不可能给你那么大的算力,比如我们在做游戏引擎的时候,整个预算只有33毫秒。但是每个系统,比如做一个非常漂亮的衣料模拟、做一个非常棒的水体效果、做一个非常酷的物理爆炸,可能只给你1-2毫秒。

并且,对帧率要求也越来越高。现在玩一个动作游戏,如果低于60帧,就觉得这个画面没办法接受。60帧意味着什么?计算只有15毫秒。Fitting到这么短的一个时间片里面,这就是现代游戏引擎设计的核心难点。

强大的工具体系

游戏引擎的第二个核心关键点:游戏引擎不仅仅是一系列的算法,它是一个生产力的工具。

从最早期的Quake时代开始,大家就意识到游戏引擎的用户不仅仅是程序员,它真正最大的用户是设计师和艺术家。

艺术家需要有一整套工具去构建世界:要放好关卡的规则、要放各种各样的敌人、NPC……

早期的工具链很简单,比如在Quake时代,一个编辑器就可以了。但是,现代游戏引擎是一个庞大的工具体系。

每一个工具,它的使用者都是学习不同专业技能的人。比如动画师,用一个角色编辑器编辑角色所有的动画、行为,甚至做上物理的模拟、布料的模拟。关卡设计师,会设计关卡里面所有的山川河流,还要看上去非常好看。designer,要去设计各种各样的规则,让这些规则变得真得好玩,还要给他们一个工具,让他们设计各种各样的AI/AI体的行为。

也就是说,一个游戏引擎如果只是一大堆代码、一个SDK,实际上是没办法用的,必须要提供一个非常强大的工具体系。

上完GAMES104课程,同学们要建立一个非常强的概念:做游戏引擎首先要学会的是做工具,这个工具的用户不是程序员,而是艺术家和设计师。

当然,程序员也是游戏引擎非常重要的用户,为什么呢?

因为在设计技术底层的时候,我们不可能知道所有的游戏类型。比如要做一个闯关动作游戏、要做一个开放世界的冒险游戏、要做一个剧情的MMORPG,每一款游戏的玩法变化都是多种多样的,不可能把所有的玩法都做到游戏引擎里面,这就要求游戏的程序员能够快速开发出特定的玩法。

二次开发能力的强弱,也是游戏引擎最重要的一个评判标准之一。

另外,游戏引擎是一个生产力工具,它有一个很重要的属性:可协作。

比如,一个人可以把整个世界构建出来:一会放棵树、一会做个规则、一会让这个小人动起来……听上去都很简单,但如果把这件事情拆给三个不同的人做,每个人只做自己的一小块,那他们之间是不是要有协作呢?

一个现代游戏工作室动辄就是上百人,大概有20-30个大的分工,每个人的技能也不一样,会写程序的非常少,有的会画贴图、有的会建模、有的会做动画、有的会搭环境、有的会调气氛……,这些人在一起,怎么协作呢?

这时候,游戏引擎的工具链就非常重要了。

我们是“工具人”,设计师美术是“大大”,我们要把他们服务好。做游戏引擎要做好心理建设:虽然做引擎很难,但一定要把自己放得特别低,因为我们的目标是服务好优秀的艺术家和设计师。

所以,工具是游戏引擎第二个非常重要的标签。

引擎架构的设计

游戏引擎是一个非常复杂的东西,把整个体系、工具设计好之后是不是就完事了?不是的。

随着时间的推移,要不断地完善升级:更好的算法、更好的展现、更好的feature,比如把光照做得越来越漂亮、把东西做得越来越细腻、做更逼真的物理模拟等等。

底层技术一直在升级,但之前做的资产、游戏逻辑必须都要能跑起来,不能一升级就不能跑了。有句行话:你要在一架飞起来的飞机上把它的零部件逐渐换掉,甚至把整个引擎都换掉,但这个飞机不能掉下来。

最开始做引擎技术架构的时候,就要做这样的设计。

如果同学们将来有机会参与到真正的游戏引擎研发,我觉得一定要有这样的觉悟:我们面对的是一个超复杂的系统。我特别喜欢用这张图,因为它能代表面对上千万行游戏引擎代码时内心的真实感受。

同学们将来可能不会从事游戏引擎开发,可能会做游戏开发,甚至不做游戏开发,只是用游戏引擎的理念和概念做一些其他方面的应用。但是,通过这门课程学到的方法论、体系结构,对面对很多复杂系统、问题都会有帮助。

关注我们

GAMES104课程官网

GAMES104课程视频

猜你喜欢

转载自blog.csdn.net/m0_74737520/article/details/127646794