上一篇:游戏开发,你需要了解的方方面面(二)游戏是如何开发出来的
什么是游戏引擎
游戏制作早期,大家习惯于从头到尾进行制作,所以开发过程缓慢且效率较低。为提高游戏生产效率,游戏开发者逐渐提取游戏中的公用部分,通过构建通用的框架来简化开发过程,从而产生了游戏引擎。
游戏引擎的发展历程
游戏引擎的发展要追溯到1992年,当时约翰卡马克推出了一款名叫《德军总部》的3D游戏,这款游戏是3D游戏的鼻祖,卡马克也因此获得FPS游戏之父亲的称号。
1993年,卡马克成立的ID公司推出了《DOOM》(《毁灭战士》),DOOM引擎便是Id Tech的第一代引擎,自此ID公司用Id Tech来进行引擎的划代。
1996年,ID公司发售了一款全新的射击游戏《Quake》(《雷神之锤》),相较DOOM的伪3D技术而言,Quake引擎是一款真3D的引擎,同时《Quake》游戏确立了FPS游戏的操控标准。
1997年,ID公司用第二代引擎制作了《Quake2》,二代引擎能够支持硬件加速。
1998年,EPIC公司推出虚幻引擎和同名游戏《Unreal》。
1999年,ID公司用第三代引擎制作了《Quake3》,这一代引擎不再支持软件渲染,仅支持硬件加速和32bit材质、高细节模型以及动态光影等新的技术标准。
2002年,EPIC发布了虚幻的第二代引擎,同时也推出同名作品,其引擎代码经过重写,并提供了全新的编辑器,功能变得更加全面。
2004年,ID公司用Id Tech第四代引擎推出了《DOOM 3》。这一代引擎大规模的使用动态光影,所以《DOOM 3》的画面表现非常出色。
2005年,UNITY面世。其目的是想让更多的人接触游戏开发,但由于最先支持Mac OS X,后来才支持Windows,所以发布时并没有引起广泛的关注。
2006年虚幻三引擎发布,使用虚幻三引擎制作的第一款游戏是《战争机器》,强大的工具链以及它所见即所得的开发模式,使得虚幻三引擎被游戏开发商广泛使用。
2006年,出现了引擎的新生代力量Cry Engine,其开发者是德国的Cry TECH。育碧公司利用Cry Engine做了一款射击游戏《Far Cry》(《孤岛惊魂》),画面堪称顶级。
2007年,Cry TECH用第二代Cry Engine制作了《孤岛危机》,这款游戏可以说是当时DX10最强画质的代表。同年unity 2.0发布,3D画面表现得到了增强。
2008年,unity第一时间支持了iPhone。
2009年,Cry Engine第三代发布,同时制作了《Crysis2》(《孤岛危机2》)。同年Unreal做出策略性的调整。EPIC发布了免费的虚幻三引擎版本,简称为UDK131。
2010年,Unity发布3.0版本,为PC和家用机平台增强了图形特性,同时也支持了安卓平台。同年,UDK也开始支持IOS和安卓平台。而虚幻三引擎是一款面向PC和家用机的高端游戏引擎,所以即使它支持移动平台,也只能在一些性能比较好的手机上才跑得动。
2012年,有130万的游戏开发者使用UNITY。
2013年,Cry Engine3.6发布,仍坚持PC和家用机平台的路线。
2014年,Epic公司已意识到移动端重要性,发布了虚幻四引擎。其功能强大,拥有插件化的设计和全平台的支持,画面表现也非常惊人。
2015年,Unity发布了5.0版本,极大地增强了画面的表现。
2016年,Cry Engine 5发布,但Cry Tech并没有看到移动平台的趋势。
2017年,著名的吃鸡游戏《绝地求生大逃杀》席卷全球,虚幻四引擎变得火爆。
2018年,《绝地求生》的两款手游出现,标志着虚幻四手游时代正式来临。
除了上述几款主流的商业化引擎外,还有很多其他成功的引擎,例如source、R星的RAGE、育碧的雪落、EA的寒霜以及Konami的FOX等。
游戏引擎架构
关于游戏引擎架构,可以分为九个层级。
(1)硬件驱动和操作系统
最底层是硬件驱动和操作系统。
硬件是执行游戏的计算机系统或游戏主机。例如基于windows/Linux的PC、苹果的Mac、ios/安卓平台的设备、微软的Xbox系列、索尼的PlayStation系列以及任天堂的掌机NDS/Wii/Switch等。
驱动指的是驱动设备程序。它是由操作系统和硬件厂商提供的最底层软件组建。驱动的主要作用是管理硬件资源、隔离硬件和上层软件,使上层软件无需理解不同硬件之间的细节差异。
操作系统可以从PC平台、游戏主机分别介绍。PC平台操作系统的主要作用是协调一台计算机上多个程序的执行,能够使硬件资源共享。而游戏主机则不同,比较老的游戏主机的操作系统通常以轻量库的形式存在,链接到游戏的执行档,游戏运行的时候,它会完全拥有整台主机;而现代主机的操作系统会更接近PC平台的操作系统,它能够中断游戏的执行,并且接管某些硬件资源。在现代,游戏主机和PC开发的分野正在慢慢收窄。
(2)第三方软件开发包
操作系统之上是第三方软件开发包。
在图形方面有著名的四大三维SDK,包括微软的Direct X,苹果的Metal以及著名的跨平台图形Open GL,和它的下一代产品Vulkan。
物理方面,有世界三大物理引擎havok、PhysX以及Bullet。还有一些其它的SDK,如VR设备使用较多的OCULUS、GoogleVG,SteamVR,以及手势捕捉工具LEAP MOTION等。
(3)平台独立层
大多数游戏引擎需要运行于不同平台上,平台独立层的功能就是隔离操作系统和上层引擎,对操作系统以及第三方软件开发包进行统一的封装。
(4)核心系统层
核心系统层包含很多重要的子模块:
① 数学库:因为游戏本质就是高度数学密集型软件;
② 内存管理:自定义内存管理模块,可以高速分配和释放内存,控制内存碎片造成的负面影响;
③ 反射序列化:在程序运行时获取自身类型信息,可以动态查找属性和调用函数。
④ 调试/日志:用于跟踪并修复错误。
(5)资源管理系统
美术资源是最重要的游戏资产之一,每一个游戏引擎都会具备某种形式的资源管理系统,能够提供统一的接口来访问任何类型的游戏资产。
游戏引擎在资源管理方面通常会遵循以下规则:
① 唯一性:任何时候,同一个资源在内存中只有一份副本;
② 生命周期:需要时载入,不需要时卸载;
③ 内存用量:确保资源存储在内存中合适的地方;
④ 引用关系:维护资源引用的正确性和完整性;
⑤ 复合资源:有多个资源组成的资源;
⑥ 异步加载:资源加载不阻塞游戏逻辑的进行。
(6)通用子系统
通用子系统是游戏引擎里面最庞大的部分,也是游戏开发过程中接触最多的部分。
该系统分为渲染引擎系统、物理系统、动画系统和多人/网格/在线游戏子系统和人体学接口设备。
① 渲染引擎
渲染引擎作为通用子系统中最重要的模块,通常会分为四个子模块:即低阶渲染器、场景图/剔除优化模块、视觉效果和前端。
低阶渲染器包含引擎中全部原始的渲染功能。它的主要作用是高速绘制图形,但不考虑场景部分是否可见。
由于低阶渲染器只负责绘制,但不可能把所有的东西都绘制出来,所以需要场景图和剔除优化的模块,它可以根据根据判别算法来决定哪些东西是需要画出来的。
关于视觉效果方面,光影、特效以及后处理都是视觉效果中重要组成部分。后处理能够加强整个画面的表现力,使整个视觉效果得到极大提升。
渲染引擎中的前端模块,通常指的是各种UI。例如在游戏界面上经常看到的HUD(平视显示器)、图形用户界面、全动视频和游戏的内置电影等。
② 物理系统
物理系统主要分为碰撞检测和物理模拟。
碰撞检测是为了防止物体互相穿透,让它们能够在虚拟世界里面进行合理的互动;物理模拟指的是真实或半真实的动力学模拟,通常是对第三方物理SDK的封装和使用。
碰撞检测分为多种情况,比如无响应——碰撞之后不产生碰撞事件(图左上),有响应——碰撞之后产生碰撞事件(图右上),重叠无响应——两个物体不知道对方的存在(图左下),重叠有响应——两个物体发生重叠时触发重叠事件(图右下)。
在物理模拟方面,常见的物理运用是布娃娃模拟(图左上),载具模拟(图右上),布料模拟(图左下)以及可破坏物件模拟(图右下)。
③动画系统
游戏里面的动画可以分为精灵/纹理动画、骨骼动画、变形目标动画、顶点动画四种类型。
精灵/纹理动画是2D动画。
变形目标动画和顶点动画,是通过插值的方式来计算顶点的位置。
骨骼动画,是游戏里使用较多的技术。主要是使用相对简单的骨头系统,设定精细的三维角色网格的姿势,所有骨头的姿势以矩阵表的形式存在。通过权重决定人物模型的顶点跟骨骼之间的关系,渲染器根据骨骼矩阵和权重转换顶点,每个顶点用一个或多个骨骼矩阵混合最终的位置(此过程称为蒙皮)。
④多人/网格/在线游戏子系统
单屏多人是两个或两个以上的输入设备接入到同一台游戏主机上,一个摄像机维持所有角色在一个画面中。
分屏多人是多个输入设备接到同一台游戏主机上,每个角色有自己的摄像机,通过分割屏幕来使每个玩家看到自己的角色。
网络多人是多台游戏主机连到同一个网络中,每个机器接待一位玩家。
大型多人在线是成千上百的游戏玩家连接到一个巨大的持久的游戏世界里,这些虚拟的世界通常是由一组强大的服务器所运作。
⑤人体学接口设备
我们常用的人体学接口设备有键盘、鼠标、手柄、方向盘、跳舞毯等。
⑥游戏专用子系统
游戏专用子系统是游戏引擎的最上层,也就是GAME PLAY类的框架层。它通常包括3C即角色Character、镜头Camera、控制器Control,以及武器道具,载具,人工智能等。
人工智能(Artificial Intelligence)缩写为AI,它是研究和开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。游戏当中的AI主要分为三种类型:棋牌类AI、动作射击游戏中的NPC和怪、战略游戏中AI的控制单元。
以设计NPC为例,我们通常需要考虑两个部分:第一是做什么,第二是怎么做。
首先是做什么。
一般用于抉择的工具有三种:有向状态机、行为树、机器学习。这三种在现代游戏引擎里使用较多的是行为树,近年来机器学习也逐渐流行起来。
行为树是一种树状结构,有根节点、子节点、分支等多种节点,其中子节点数量是任意的。我们可以自顶向下进行搜索,进而决定最终的行为。叶子节点是指各种行为,最终执行的就是叶子节点中的各种行为。
构成行为树的主要元素有控制节点、行为节点以及前提条件。控制节点分为选择节点、顺序节点、并行节点、行为节点。
选择节点指的是根据先决条件选择子节点执行;顺序节点指的是依次执行所有的子节点,并行节点指的是同时执行所有子节点,并设定退出条件;行为节点指的是具体的行为,不同的游戏需要定义不同行为节点,行为节点可以复用。
关于怎么做,它需要解决的问题是去什么地方做什么事情。
首先是寻路。导航网格寻路是一种相对普遍的寻路机制,大部分游戏引擎都会集成一套导航网格的构建系统,如Unity(图左),虚幻(图右),同时通常会提供一套基于导航网格的寻路算法。
然后是移动,移动可以分为单体移动、群体移动、阵型移动。如下图所示是一种类似于群体移动的表现,在移动过程会有群体性的表现,互相间会有一些斥力,朝着一个人物的方向移动,这便是《Fortnite》(《堡垒之夜》)中利用虚幻四做的群体移动组件的功能。
最后是动作,当挑选行进方向后,需要通过动作来表现具体行为,根据动作树可以混合出游戏角色的动作表现,比如走跑跳、站蹲趴等。