游戏引擎原理与实践·卷1:基础框架
上QQ阅读APP看书,第一时间看更新

1.1 什么是游戏引擎

什么是游戏引擎?其实这很难给出明确的定义。在很多游戏的宣传中,我们会听到对游戏引擎的推崇。绚丽的特效,流畅的体验,似乎都是游戏引擎的功劳。在游戏玩家看来,游戏画面的表现力越好,游戏场面的震撼程度越大,游戏体验的真实感越强,底层的游戏引擎就可能越强大。

看看业界给出的一些定义。

游戏引擎是指一些已编写好的可编辑计算机游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地写出游戏程序而不用从零开始。大部分游戏引擎支持多种操作平台,如Linux、Mac OS X、Windows。游戏引擎包含渲染引擎(即“渲染器”,含二维图像引擎和三维图像引擎)、物理引擎、碰撞检测系统、音效引擎、脚本引擎、电脑动画引擎、人工智能引擎、网络引擎以及场景管理引擎。

根据上述定义,在很多人看来,游戏引擎负责把很多已有的零部件组装起来,如同组装手机,CPU、屏幕、摄像头、主板等都是别人生产的,手机厂商按照自己喜欢样式组装一下就好了。

下面再看看Game Engine Architecture(中文书名《游戏引擎架构》)是怎么说的:

通常,游戏和其引擎之间的分界线是很模糊的。一些引擎有相当清晰的划分,一些则没有尝试把二者分开。在一款游戏中,渲染代码可能特别“知悉”如何画一只妖兽(Orc);在另一款游戏中,渲染引擎可能只提供多用途的材质及着色功能,“妖兽”可能完全是用数据去定义的。没有工作室可以完美地划分游戏和引擎。这不难理解,因为随着游戏设计的逐渐成形,这两个组件的定义会经常转移。

似乎游戏界引擎专家也无法真正给引擎下一个明确定义,虽然大家都知道什么是游戏引擎,却很难用三言两语把它表述出来。本节尝试用比喻的方式把它讲清楚。

假设我们穿越回20世纪80年代,我们的手中已经有整套的FC游戏《超级马里奥》[见图1.1(a)]的代码,现在我们要开发另一款FC游戏《冒险岛》[见图1.1(b)]。此时我们需要从零开始吗?显然,这两款游戏有着太多共性,都是一个游戏角色在横板卷动的地图上蹦来蹦去,都可以踩死怪物。当然,也有不同,画面不同,声音不同,关卡不同……但对于共同的功能,聪明的我们当然会重用一些现成的代码。而这种横板卷轴游戏模板的通用性非常好,目前游戏界对它的需求量也非常大,所以我们决定把这种特定类型游戏的核心功能提炼出来,供那些也要开发这种游戏的人使用。

(a)

(b)
图1.1 《超级马里奥》与《冒险岛》游戏画面

后来,蹦蹦跳跳的游戏逐渐没落,即时战略游戏开始兴起,有人要开发即时战略游戏《红色警界》(如图1.2所示)。

图1.2 《红色警界》游戏画面

虽然游戏模板的代码能渲染2D动画、播放声音、处理鼠标键盘的按键响应,但无法用于即时战略游戏。因为玩家们想要的是多人联网,这就要求程序能够处理大量同屏2D动画,能够快速编辑适应即时游戏的关卡,能够运行无法与玩家和平相处的AI,甚至能够让游戏运行在不同的地方,比如PS1和PC。可是原有的游戏模板根本做不到这些。

直到有一天,卡马克设计了一款叫《DOOM》(中文名《毁灭战士》)的游戏(如图1.3所示),这简直就是PC(DOS系统)游戏史的一个里程碑。这款游戏漂亮的3D画面,让很多游戏爱好者在计算机前面“火拼”。

图1.3 《DOOM》游戏画面

卡马克又写出了全3D的游戏《QUAKE》,而且支持当时最强大的3D加速卡,人们再次被震惊了。崇拜卡马克的人们用《QUAKE》的代码制作了新的射击游戏——《Counter-Strike》,也就是家喻户晓的CS。《QUAKE》的动画、渲染的程序也被拿来继续开发其他游戏。

故事总归是故事,但对于《冒险岛》来说,被复用的那部分《超级马里奥》代码其实就是最早的游戏引擎。不过它的技术没那么先进,功能也不甚强大,还缺乏顺应潮流的更新,以致最终销声匿迹了。但卡马克的代码则不同,它超越了当时人们的想象力。他不但为射击游戏制定了完整方案,而且实现的代码功能强大。其高度的复杂性和健壮性,甚至让很多人乐于用其中的某些模块去开发非射击类的游戏,结果不但节省开发时间而且游戏健壮性也不错。这几乎是一部简短的游戏引擎发展史。

我们为什么要如此辛苦地探讨引擎的定义?每个人心中都有自己的哈姆雷特,对错已经没那么重要。开发属于我们自己的游戏,了解哪个引擎更强大以及什么引擎更适合,才是研究游戏引擎的真正意义所在。