<audio id="audio" title="第3讲 | 游戏的发动机：游戏引擎" controls="" preload="none"><source id="mp3" src="https://static001.geekbang.org/resource/audio/3b/d7/3bac6a1663adf432f553d31e30b48bd7.mp3"></audio>

估计长期玩游戏的玩家，都能脱口而出几款游戏引擎的名字，比如“虚幻”“寒霜”“狂怒”等等。那你能说说，游戏引擎究竟是什么吗？它在游戏开发中究竟起着什么样的作用呢？

## 游戏引擎是什么？

汽车没有发动机就无法跑起来，人类没有心脏就会死亡。而引擎就是发动机，就是心脏。

我们先来看一下维基百科对于游戏引擎的定义：

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

这个概念是不是看起来还是不太好理解？我来具体解释一下，游戏引擎到底是什么，以及它究竟能干什么。

<li>**游戏引擎就是图形引擎。**准确地说，游戏引擎约等于图形引擎。玩家口中所说的“虚幻”“寒霜”等，这每一款引擎对于图形渲染的处理方式都不同，所以用某个引擎编写出来的游戏，具体的表现画面也会不同。比如，有的引擎编写出的光影效果特别绚丽，有的则粒子效果特别真实。
</li>
<li>**游戏引擎是一整套游戏解决方案。**其实，游戏引擎并不仅仅等同于图形引擎。图形引擎只是游戏引擎中一个占比极大的组成部分。一款好的游戏引擎，不仅要看它对于图形图像的处理能力，也要看它对于其他部分的处理能力，比如对音频、音效的播放、键盘鼠标的处理，以及UI界面的编辑和各种处理工具的提供。这里的处理工具包括地图编辑器、关卡编辑器、人物编辑器、资源编辑器、物理碰撞、碰撞检测等。所以，从专业的角度讲，游戏引擎是完成开发一套游戏的解决方案，而不仅涉及图形部分。
</li>
<li>**游戏引擎是一整套编程接口。**要写游戏就必须写程序，所以有游戏引擎就一定需要编程。不管你是直接面对引擎编写代码，还是在引擎提供的编辑器（比如关卡编辑器）基础上编写简单的逻辑代码，写代码都是必不可少的。在引擎提供的编程接口上，你能很容易地调用各种接口完成游戏的开发。
</li>

## 游戏引擎是怎么工作的？

说完了游戏引擎是什么，我们来看游戏引擎具体是怎么工作的。 

我先从代码层面来说。这里是一段伪代码：

```
int DrawLine(const Surface&amp; s, int sx, int sy, int fx, int fy, int fit, const Color&amp; color);

```

这段伪代码提供了一个在屏幕上画一个线条的函数。该函数提供了7个传入参数，分别是：

- 目标图层
- 线（在游戏窗口内）的起始x点
- 线（在游戏窗口内）的起始y点
- 线（在游戏窗口内）的终止x点
- 线（在游戏窗口内）的终止y点
- 线条粗细
- 线条颜色

在调用了这个函数之后，你就能很容易在屏幕上画出一个线条。同时，在这个函数背后，引擎做了一系列这样的动作：

- 判断传入的Surface图层对象是否正确、是否存在；
- 判断传入的起始点、终止点是不是存在负数；
- 判断颜色是不是正确；
- 拆分Color变量为RGB值，填入到SDL绘图接口，调用SDL绘图接口绘制一条线。

关于绘图接口，我会在下一节的内容中详细讲解。这里，你只需要知道，画线的接口函数在背后分解、组合、计算，然后会将绘制工作交给底层绘图接口就可以了。

之所以要拿这个画线函数举例，是因为它展示了引擎中函数的使用方式。如果我们用一般的画线函数画圆，那首先要知道圆的直径和计算方式；如果画矩形，那就要知道哪里是起始点和终结点。这一系列动作等于将引擎所做的工作包含在了画线函数里，你只需要关心画线的这一系列参数如何使用就可以了。

说完了代码层面，我们来说说非代码层面的东西。

**游戏引擎其实也包括游戏开发的一系列工具，也就是诸如地图编辑器、关卡编辑器、人物编辑器、资源编辑器等。**美术、策划、制作人等，这些开发流程中的责任人，可以往工具内填入需要的东西，制作出需要的内容。

我们拿人物编辑器来举例。如果我们使用通用编辑工具（比如3DMAX、Maya等）编辑出来内容，需要经过格式的转换才能应用到游戏中，但是这样不仅耗费转换时间，也耗费调试时间。因为通用工具可能并不适合引擎本身所定义的格式，需要不停修正和更改。如果引擎本身就提供了这样的制作工具，那么制作出的内容直接就能在游戏中使用，不需要转换，所见即所得。

所以，游戏引擎背后的工作方式是：

- 在代码层面，游戏引擎是对绘图接口、操作系统、音频等接口进行的代码层面的封装；
- 在工具层面，游戏引擎是一整套游戏内容的制作工具，方便你制作针对这个引擎的游戏内容。

## 自己开发引擎还是直接购买？

了解了游戏引擎的概念和工作方式，那么开发者究竟是自己编写引擎还是购买商业引擎比较好呢？

从一般意义上讲，如果有实力，当然是自己开发引擎更贴合公司的情况。然而，这样付出的代价就是，花费大量的人力和财力，而且，以一般小公司或者起步阶段的开发者的开发水平，编写出的引擎，很可能只是一个半成品或者问题多多的残次品。**自研引擎并不是一个不可能完成的任务，但是要看公司的财力和程序员的实力。**

购买商业引擎是现在大部分公司都会走的一条路。购买商业引擎只需要花费一笔钱就能拿到成熟的游戏引擎，直接可以开发游戏，然而付出的代价就是，你可能需要从头开始学习这套引擎的工作原理、工具套装。

如果你非常熟悉3DMAX等通用工具，那要从头学习开发工具，就会产生许多问题，比如：

1. 引擎中包含的开发工具基本没有通用性可言。就算吃透了工具，对你今后的能力提升和职业规划也没有明显的帮助；
1. 如果引擎升级或者更换引擎，就需要从头再学一次工具，会耗费大量时间和精力。当然会有一些优秀的商业引擎支持通用工具制作的内容导出和转换，直接在引擎中可以使用，当然这种引擎的购买费用也会更高；
1. 另外，商业引擎本身也会存在一些隐藏得很深的bug。在游戏发布后，这些bug可能会影响到游戏本身的质量和口碑。引擎出问题，游戏一定出问题，这也是购买商业引擎需要考量的一个风险。

但是，在实际的开发过程中，考虑到公司的经济实力和程序员的开发能力，一般来说，大多数开发者都会选择购买商业引擎，毕竟这在一定程度上，是个非常省时省力的事情。

## 游戏引擎是用什么编写的？

尽管如此，你还是需要掌握更多游戏引擎相关的知识。因为，不管你是购买游戏引擎还是自己开发游戏引擎，了解游戏引擎，会让你对游戏编程的总体脉络有一个了解。一旦在开发过程中出现问题，比如你发现屏幕贴图出问题了，那究竟是自己的代码出现问题，还是引擎本身出现问题呢？熟知游戏引擎的开发逻辑，你就能很快定位问题所在。

事实上，**游戏引擎并没有一种固定的开发语言，就看你所制作游戏的目标平台是什么。**

### 1.C/C++

如果你在Windows或者Linux下开发游戏，游戏引擎99%都是使用C/C++或者汇编语言编写。由于C/C++和汇编运行效率高，所以在Windows下的执行效率也非常高。你看到的Python游戏引擎、Ruby游戏引擎等脚本语言引擎，都是在C/C++的基础上进行封装的。这样可以方便程序员将专注力放在游戏逻辑上，而不是在处理底层问题上。

### 2.**JavaScript/TypeScript**

如果是HTML5游戏，游戏引擎的编程接口99%是使用JavaScript完成的。比如耳熟能详的Cocos2d引擎、白鹭引擎等等。至于其他配套的开发工具，可以使用任意软件开发语言进行编写。

### 3..NET

经过微软的努力和版本迭代，在Windows下，.NET的运行效率和开发效率已经提高了好几个等级。由于和Windows紧密结合，现在的.NET的运行效率只比C/C++编写的代码低一点。在电脑配置比较高的情况下，用户基本不会有太多的感知。而.NET对于Windows底层的调用和控制，比C/C++更方便，编程也更容易，所以现在已经出现了一些引擎是使用.NET编写的。这对于.NET开发者来说是一件好事。

### 4.Java

和.NET一样，使用Java编写的游戏引擎并不多。虽然Java的运行效率已经有了质的提升，但是对于编写大型游戏来说还是有相当大的瓶颈。随着电脑硬件配置的提升，使用Java编写游戏也不再是一件不可能的事情。比如大火的《我的世界》，就是使用Java编写的。

## 小结

好了，这一节内容差不多了，总结一下，我主要给你分享了四个内容，分别是游戏引擎的定义、游戏引擎的工作方式、游戏引擎的选择和编写。

你只需要记住以下这些内容即可：

- 游戏引擎是一整套的游戏开发程序接口和开发组件，可以让你更方便、更专注于游戏的开发；
- 游戏引擎控制着游戏的几乎所有内容，游戏的表现质量和游戏引擎直接相关；
- 针对不同的平台，游戏引擎所使用的编程语言也不一样。而了解了游戏引擎的编写，在之后的开发过程中，会有非常多的便利。

最后，给你留一个思考题：

什么情况下，我们可以跳过游戏引擎，直接编写一款游戏呢？

欢迎留言说出你的看法，我在下一节的挑战中等你！


