2.1 常用3D游戏引擎介绍
在本节中,我们将介绍什么是游戏引擎、游戏引擎是如何产生的、游戏引擎的基本架构是怎样的,以及主流3D商业游戏引擎的对比分析。
2.1.1 什么是游戏引擎
顾名思义,游戏引擎就是用来开发游戏的软件框架。游戏开发者使用游戏引擎开发适合运行在各种平台上的游戏,包括掌机游戏、主机游戏、PC游戏、手机游戏和AR/VR游戏。
很多游戏引擎都提供了一整套可视化开发工具,以及可重用的软件功能。这些开发工具通常以一种集成开发环境(IDE)的形式提供,让开发者不必从零开始“造轮子”。游戏引擎有时候又被称为中间件,通过游戏引擎开发者可获得极大的便利和灵活性,可以有效提高开发效率,降低开发的复杂度,缩减开发成本。
游戏引擎的核心通常包括用来生成2D或3D画面的渲染引擎(渲染器)和用来模拟真实世界物理法则的物理引擎(或者碰撞检测),此外还可能包括音效、脚本、动画、人工智能、网络、流媒体、内存管理、线程管理、本地化支持、场景视图和全景视频支持等功能。
在游戏引擎出现之前,游戏对开发者的能力要求比其他类型软件开发的能力要求更高。以早期的Atari 2600游戏机为例,在这个平台上耕耘的游戏开发者必须精通硬件的底层架构,包括如何合理使用和显示相关的硬件,并熟悉相关操作系统的内核。即便开发者可以无视显示部分的底层架构,内存的限制和调用也是开发者头上的紧箍咒。
20世纪90年代,游戏大神John Carmack创立了id Software,并把目标投向3D游戏的研发。在他的带领下,id Software接连推出了《德军总部3D》《毁灭战士》《雷神之锤》等惊世之作。在开发这些游戏的过程中,Carmack史无前例地采用了自己独创的3D游戏引擎。以《毁灭战士》为例,其软件架构可以清晰地分为3部分:核心游戏组件(如3D图形渲染系统、碰撞检测系统、音效系统等)、美术资源和游戏场景以及和玩家游戏体验紧密相连的游戏规则。通过使用游戏引擎,游戏开发者可以在游戏核心架构不变的情况下设计自己的游戏画面、人物角色、武器和关卡,即所谓的“游戏内容”或“游戏资源”。游戏引擎把和游戏内容本身无关的碰撞检测机制、渲染等独立出来,从而让开发者可以专注于游戏内容和机制的设计。
在Epic Games于1998年推出的Unreal游戏中,开发者采用了类似的理念,也就是将引擎本身和游戏内容分开。游戏引擎本身和游戏内容一样开始具备独立的商业价值。在这个时期,高端的商业引擎开始出现,比如Epic Games推出的Unreal Engine(虚幻引擎)。这种高端商业引擎虽然授权费动辄数万甚至数百万美元,但可以让多个公司使用,且游戏开发公司可以快速开发自己的游戏内容。从这个角度来看,游戏引擎推动了整个游戏行业的发展。
随着游戏引擎技术发展的成熟,引擎界面和操作流程对开发者来说也越来越友好,引擎本身的应用领域也越来越广,从传统的游戏开发拓展到其他领域,比如视觉设计、培训、医疗、军事模拟和建筑等。与此同时,除了传统的游戏主机、掌机和PC,游戏引擎开始支持更多的设备平台,包括智能手机(Android手机和iPhone)、网络浏览器和VR设备等。
此外,大多数的3D游戏对GPU的资源要求与日俱增,也受限于显卡性能。考虑到提高开发者效率的需求,越来越多的游戏引擎不再需要开发者直接使用C++语言开发,而是使用更容易上手的编程语言,如Java、C#、Python、Lua等。
2.1.2 游戏引擎架构基础
由Jason Gregory撰写的非常经典的《游戏引擎架构》(Game Engine Architecture)一书,将游戏引擎分为工具套件和运行时组件两大部分。目前该书已经出版到第3版,本书将借鉴这种思路对游戏引擎架构进行介绍。考虑到本书主要面向刚入门的开发者,故这里仅进行简单介绍。
图2-1显示了一个典型3D游戏引擎的运行时组件。
图2-1 游戏引擎架构
需要特别说明的是,图2-1显示的是游戏引擎在整个游戏体验环节中所处的位置,并不意味着游戏引擎本身就包含了以上所有的元素。
1. 硬件层
硬件层代表用于执行游戏的游戏主机系统,包括基于Windows或Linux操作系统的PC设备、基于苹果Mac操作系统的Mac电脑、微软的Xbox系列游戏主机、索尼的PS系列主机和掌机、任天堂的游戏主机和掌机、现在主流的iPhone或Android智能手机及平板设备,以及未来可能成为主流的AR/VR独立一体机设备。PC、游戏主机、掌机、移动设备和AR/VR/MR设备的硬件架构具有相当大的差异,这对游戏引擎的设计也会有所影响。
2. 设备驱动
设备驱动层代表由操作系统或硬件厂商提供的驱动程序,用于管理硬件资源,同时将操作系统和上层引擎隔离开来,使得上层的软件无须理解不同硬件版本的通信差异。
驱动程序相当于硬件和操作系统之间的接口,操作系统只有通过这个接口才能控制硬件设备的工作。如果没有正确安装硬件设备的驱动程序,那么硬件就形同虚设。
驱动程序被称为“硬件的灵魂”。当操作系统安装完毕后,首先要做的就是安装一大堆硬件设备的驱动程序。当然,诸如硬盘、显示器、光驱、USB接口、键盘、鼠标等基础硬件是不需要安装驱动程序的,但是对于显卡、声卡、扫描仪、摄像头、网卡、游戏手柄控制器等就需要安装驱动程序。
具体来说,驱动程序指的是添加到操作系统中的一小段代码,其中包含了硬件设备的信息,计算机根据此信息和硬件设备进行通信。比如当操作系统需要使用声卡播放音乐时,会先把软件生成的相应指令发送到声卡驱动程序,而声卡驱动程序需要把指令翻译成声卡可以理解的电子信号指令,才能正常播放音乐。
当然,对游戏玩家和游戏开发者来说,最熟悉的还是显卡驱动程序,特别是Nvidia的显卡驱动程序,因为其更新频率非常高。为此,Nvidia推出了Nvidia Geforce Experience软件,可以方便地升级更新显卡驱动,从而获得更好的游戏视觉体验。
3. 操作系统
操作系统层代表硬件之上运行的操作系统,其主要作用是协调游戏硬件设备上多个程序的执行。
在PC上,操作系统是一直运行的,游戏需要和多个执行中的程序共享硬件。而在游戏主机上,操作系统充其量只是一个轻量级的库,可链接到游戏的可执行文件。随着游戏主机的推出(Xbox One和Playstation 4),游戏主机和PC开发的界线正在逐渐模糊。
除了基于PC的Windows操作系统,还有UNIX操作系统、基于UNIX的Linux操作系统,以及基于UNIX的苹果Mac操作系统。
当然,对于智能手机来说,目前主流的是支持安卓智能手机和平板设备的Android操作系统、支持苹果iOS设备的iOS操作系统。
相信在不久的将来,我们会看到专门用来支持AR/VR独立一体机设备的操作系统以及支持智能机器人设备的操作系统。
4. 第三方SDK
很多游戏引擎都会借助第三方软件开发工具包(Software Development Kit,SDK)和中间件,并提供基于函数或基于类的应用程序接口(Application Programming Interface,API)。
这些第三方的SDK可以用于处理数据结构及算法(如STL/STLPort、Boost++)、图形渲染(如OpenGL、DirectX)、碰撞和物理参数(Havok、PhysX)、角色动画(Granny、Havok Animation、Edge)、生物力学角色模型(Endorphin、Euphoria)、AR/VR等。
5. 平台独立层
大多数游戏引擎需要支持不同的平台,因此在游戏引擎的架构中通常有一个平台独立层。其处于硬件、驱动程序、操作系统和其他第三方SDK之上,从而将引擎的其他部分和底层平台隔离。
6. 核心系统
这里的核心系统不是指引擎的核心功能,而是指引擎中一些有用的软件。核心系统通常支持断言(Assertion)、内存管理、数学库、自定义数据结构及算法等。
7. 游戏资源管理
什么是游戏资源呢?为了让玩家有最理想的视听感受,相比其他类型的软件,游戏最大的特点就是拥有丰富的外部资源,比如酷炫的视觉效果、栩栩如生的3D人物和场景、引人入胜的背景音乐和互动音效、充满艺术感和情怀的字体等。相信在不久的将来,我们甚至可以在游戏中提供视觉和听觉之外的其他感觉通道信息,比如触觉、味觉等。
每个游戏引擎都需要有一个特定形式的游戏资源管理器来提供特定的接口,以便访问各种类型的游戏资源,如3D模型、纹理贴图、材质、骨骼动画、碰撞、物理参数、游戏世界/地图、音效、字体等。
8. 视觉渲染
在游戏引擎中,视觉渲染部分是最重要的组件,其中包括低阶渲染器(Low-level Renderer)、场景图/剔除优化、视觉效果(粒子特性、光照贴图、动态阴影、全屏后期处理效果、颜色校正等)、前端(HUD、游戏内置图形用户界面、游戏内置菜单、游戏内置全景视频等)等。
作为游戏引擎最为核心也是最初始的组成部分,实时三维视觉渲染的好坏是判断一款游戏引擎功力是否深厚的最核心指标。但是要深入掌握游戏的实时三维视觉渲染系统并不容易,这需要我们掌握3D数学、线性代数、数值计算、计算机图形学,OpenGL、引擎中的工具管道架构以及运行时的渲染API等。
幸运的是,初学者只需要了解如何基于现有的引擎实现所需要的效果。
9. 性能分析与调试
游戏引擎中通常会内置性能分析和调试工具,如内存分析、代码调试等,以便开发者更方便地对游戏的性能进行优化。需要强调的是,游戏的性能优化将耗费游戏开发者相当多的时间和精力,同时也是决定玩家能否拥有良好体验的关键因素。
游戏的卡顿对于游戏体验是非常致命的,任何一个游戏玩家都会明白帧速的重要性。Nvidia和AMD每年在显卡硬件上投入重金,一个很重要的原因就是在提升游戏画质和视觉呈现效果的同时,让游戏运行更加顺畅。
对于AR/VR游戏或应用来说,性能优化则显得尤为重要。特别是对于VR游戏,性能优化是影响玩家体验的最关键因素。因为对于VR游戏来说,其需要以90~120fps的帧速在两个分屏幕中显示游戏画面,而如果优化不给力,很可能导致玩家在5分钟之内就产生恶心或眩晕的感觉。
10. 碰撞和物理
游戏引擎中内置的碰撞(Collision)检测和物理(Physics)系统用于模拟真实世界中的物理法则,更常用的是刚体动力学模拟。那么,什么是游戏中的物理法则呢?其实很简单,对于大多数游戏来说,我们只要掌握经典物理学中的牛顿力学就好。对重力和牛顿三大定律的模拟是游戏物理系统中最关键的一环。经典物理学中与电磁相关的麦克斯韦方程以及与分子运动相关的统计热力学,通常不是关注的焦点。至于更高深晦涩的量子力学和相对论,至少目前的商业引擎并不会涉及。
经典牛顿力学是游戏引擎对物理法则进行的第一个重要的简化假设,但实际上游戏中的物理系统还有另外一个重要的简化假设—经典刚体动力学。到目前为止,大多数游戏引擎只关注经典动力学中的经典刚体动力学。
什么是刚体?其实很简单,在虚拟的游戏世界中,通常我们所模拟的物体对象是完美的固体,不会变形(液体和气体是经典的反例)。换句话来说,物体的形状是固定不变的,这种假设可以很好地适合碰撞检测系统,从而大幅简化模拟固体动力学所需要的数学计算。
因为有了以上的两个简化假设,游戏世界中的物体运动才会符合多个约束(Constraint),其中最常见的约束是非穿透性,也就是说两个物体不能互相穿透。如果发现物体之间穿透,就需要物理系统提供真实的碰撞响应。这也是为什么游戏中的物理系统和碰撞检测系统往往是紧密联系在一起的。
除了简单的碰撞,游戏中的物理系统还可以允许开发者设置其他类型的约束,从而更好地模拟物体之间的真实互动,比如铰链、关节、布娃娃等。
目前,使用最为广泛的物理引擎是Nvidia的Physx物理引擎,Unity3D和UE4引擎中内置的物理引擎都是PhysX。除此之外,很多游戏工作室在诸多的游戏大作中都采用了Havok或Bullet物理引擎。PhysX、Havok和Bullet被公认为最知名的三大物理模拟引擎系统。
最近几年,行业专家、数学家、物理学家和游戏引擎开发者正在尝试研发超越经典刚体动力学的物理引擎功能,比如DMM引擎开始支持对形变体的支持。UE4引擎对布料、头发的模拟大下工夫。而更深入的研究则是对通用的流体动力学的模拟。
11. 骨骼动画
很多游戏中的角色,比如人类、动物、卡通角色和机器人等,都需要使用动画系统才能在游戏中变得活灵活现。
传统意义上的动画是把人物或物体的表情、动作和形态变化分解成很多瞬间的图画,再使用摄像机(或是数字摄像机)连续拍摄生成一系列的画面,从而让人类的视觉变化连续。其基本原理和电影电视一样,都运用到了视觉暂留原理。所谓的“视觉暂留”,指的是人眼在看到一幅画或者一个物体时,在0.34秒内所形成的视觉印象并不会消失。利用视觉暂留原理,在一幅画还没有消失前就开始播放下一幅画,就会给人带来流畅的视觉变化。
早期动画时代有手绘动画。简单来说,那个时代的动画是用一帧帧相似度比较高的画面连续播放而生成的。经典的手绘动画包括早年的迪士尼系列、中国的传统水墨动画、日本宫崎骏的动画作品等。到了后来的Flash时代,我们使用顶点动画中所谓的“关键帧”让画面看起来具有连贯性,但基本原理还是视觉暂留。如今大家很熟悉的gif动图还是基于这个原理。
所谓的“顶点动画”,其本质就是让每帧动画对应人物或角色模型特定姿态的一个快照,然后通过在关键帧之间插值计算的方法,得到平滑的动画效果。
Unity3D的早期版本中主要也是基于顶点动画的关键帧技术来生成常规动画的。其动画系统被称为Animation。但是,这类动画对于3D的人物角色来说是远远不够的。
从20世纪90年代开始,以皮克斯为代表的美国动画巨头开始采用计算机技术替代传统的手绘动画。它的基本原理是为角色设置以互相连接的骨骼组成的骨架结构,然后改变骨骼的朝向和位置生成动画。
通过骨骼动画系统,可以轻松创建人形角色的动画,并让角色具备更灵活复杂的姿态。部分引擎还支持面部动画系统,通过音位和情绪来修改骨骼集合,从而呈现栩栩如生的面部表情和嘴部动作。
除此之外,骨骼动画系统与动捕设备配合可以将所获取的真实人类的角色动作和表情重现在游戏世界之中。
几乎所有的引擎都支持顶点动画,但只有部分引擎才支持骨骼动画。Unity3D是支持骨骼动画的,其动画系统被称为Mecanim。
12. 人机接口设备
任何一个游戏都需要玩家和游戏世界产生互动,而玩家的输入需要使用人机接口设备(Human Interface Device)来实现。
为游戏而设的人机接口设备实在是太多了,最常见的就是键盘和鼠标。其他交互设备包括摇杆、游戏手柄、轨迹球、Wii控制器、Sony PS Move、Xbox controller、模拟方向盘、鱼竿、跳舞毯、电子吉他等。对于智能手机和AR/VR设备来说,还包括iPhone和安卓设备中的加速度计、触摸屏、力反馈和震动反馈设备、手柄控制器、仿真枪、跑步机等。
未来的AR/VR设备则更多采用自然交互技术和多感官交互设备(手势识别、语音识别、动捕、表情捕捉、嗅觉反馈、触觉反馈、温度觉反馈、平衡觉反馈等),甚至直接使用脑机接口技术来实现对人体更多感官通道的模拟。
13. 多人在线
对于支持多人在线(Online Multiplayer)的游戏,游戏引擎必须提供对应的网络联机功能。
网络联机功能又分为局域网联机和互联网联机。对目前的大多数游戏来说,联机功能指的是互联网联机。大家熟悉的联网游戏有《魔兽世界》《王者荣耀》和《绝地求生》等。
是否联网并不是一个游戏吸引人的唯一要素,比如《GTA5》《使命召唤》等经典单机游戏也得到众多赞誉。但是,联网特性对于多人实时在线游戏来说是不可或缺的,因为玩家之间的互动和社交连接都需要基于这一点。还有部分游戏采用单机和网游结合的模式,如《暗黑破环神3》和《原神》。
14. 音效
好的游戏背景音乐和音效可以大大提升游戏的吸引力,因此绝大多数游戏引擎会提供音效系统。
对于部分游戏来说,人们甚至仅仅因为其中的背景音乐和互动音效就喜欢上了。在音乐方面表现突出的游戏推荐有《仙剑奇侠传》《魂斗罗》《大话西游2》《梦幻西游》《极品飞车》《反恐精英》《寂静岭2》《最终幻想》等。
15. 游戏性基础
除了画面、声音和对真实世界的模拟外,任何一款游戏都需要具备特定的规则,也就是游戏性基础(Gameplay Foundations)系统,其中包含游戏世界和游戏对象模型、事件系统、脚本系统等。
虽然传统的欧美3A大作依靠令人震撼的游戏视觉效果吸引了众多玩家,但也有很多经典游戏不是拼视觉效果,特别是任天堂出品的众多游戏,最突出的特点是游戏性,如《塞尔达传说》《蔚蓝》。
16. 系统
游戏专用子系统(Game-Specific Subsystems)处于低阶引擎组件之上,用于实现游戏本身的各种特性,包括玩家机制、游戏摄像机、武器系统、载具等。
除了用于实现游戏核心内容的运行时组件外,游戏引擎通常还提供了一些工具套件,用于丰富游戏内容。
游戏引擎需要使用各种形式的数字内容,比如3D模型、纹理贴图、骨骼动画、音频文件等。因此,游戏引擎中通常需要内置专用的资源管道,以便从外部的DCC(Digital Content Creation,数字内容创作)软件中导入相关资源。
虽然有类似Houdini这种第三方工具,但游戏引擎并不能支持第三方工具所制作的所有效果。因此,大多数游戏引擎内置了粒子特效编辑工具。比如Unity3D引擎中就内置了名为Shuriken的粒子系统。
此外,虽然使用3DS Max或Maya、Blender等3D建模软件可以导出所需的游戏场景,但大部分商用游戏引擎都内置了世界编辑器。世界编辑器既可以作为资源管理工具,也可以用于创建游戏世界和场景的基础原型。
2.1.3 主流3D引擎对比分析
打开维基百科,在游戏引擎清单的词条下会看到长长的一串列表,比如Unity3D、Unreal Engine(虚幻)、CryEngine、Cocos2d、Corona、Frostbite(寒霜)、Gamebryo、GameMaker、id Tech系列、Infinity Engine、OGRE、Panda3D、Renderware、RPG Maker、Source、Torque3D等。其中有些引擎大家可能听说过,比如Unity3D、Unreal Engine(虚幻)和Cocos2d,而更多的引擎则很少为常人所熟知。
虽然可供选择的游戏引擎很多,但具体到3D移动游戏开发和AR/VR游戏应用开发领域,最值得关注的两款商用3D游戏引擎莫过于Unity3D和Unreal Engine。
这里先对这两款游戏引擎做一个简单的介绍和对比分析,在后面的内容中将会着重对Unity引擎做详细介绍。
Unreal Engine是由Epic Games开发的一款商用游戏引擎,其第一个版本发布于1998年。Epic Games本身也开发自己的游戏,其开发虚幻引擎最初就是为了便于开发Unreal Tournament(虚幻竞技场)这款游戏的。2020年6月,Epic在Sony PS5的产品发布会上展示了使用UE5开发的产品demo,并透露了下一代虚幻5引擎的诸多新特性,引起了众多开发者的兴趣。
虽然虚幻引擎的功能很强大,但是由于需要学习C++语言,且学习曲线相对比较陡峭,所以入门相对较难。
相比虚幻引擎这种专业且复杂的游戏引擎,Unity引擎的初衷一直是:人人皆能开发游戏。Unity的编辑器界面简洁易上手,脚本语言支持C#,而且教程、资源非常丰富,开发者能够很轻松地上手。而且随着Unity的不断迭代更新,曾经为人诟病的渲染、光照、粒子特效等影响游戏视觉效果的部分已经大大提升。最新的Unity 2020版本更是有了质的飞跃。
也许你已经发现,对于新手来说,如果希望尽快完成自己的第一款游戏作品或AR/VR作品,那么Unity无疑是最好的选择。其不需要太高的成本,也不需要太多精力,只要你有丰富的创意,就可以立即动手开发游戏和AR/VR作品。
相信看到这里,大家已经迫不及待地想要学习和掌握这款强大的游戏引擎了。别着急,从下一节开始,我们将正式开始对Unity的学习,首先从Unity的授权、服务和安装开始。