极客时间已完结课程限时免费阅读

第3讲 | 游戏的发动机:游戏引擎

第3讲 | 游戏的发动机:游戏引擎-极客时间

第3讲 | 游戏的发动机:游戏引擎

讲述:蔡能

时长09:51大小4.53M

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

游戏引擎是什么?

汽车没有发动机就无法跑起来,人类没有心脏就会死亡。而引擎就是发动机,就是心脏。
我们先来看一下维基百科对于游戏引擎的定义:
游戏引擎是指一些已编写好的可编辑电脑游戏系统或者一些交互式实时图像应用程序的核心组件。这些系统为游戏设计者提供各种编写游戏所需的各种工具,其目的在于让游戏设计者能容易和快速地做出游戏程序而不用由零开始。大部分都支持多种操作系统平台,如 Linux、Mac OS X、Windows。大多数游戏引擎包含以下系统:渲染引擎、物理引擎、碰撞检测系统、音效、脚本引擎、电脑动画、人工智能、网络引擎以及场景管理。
这个概念是不是看起来还是不太好理解?我来具体解释一下,游戏引擎到底是什么,以及它究竟能干什么。
游戏引擎就是图形引擎。准确地说,游戏引擎约等于图形引擎。玩家口中所说的“虚幻”“寒霜”等,这每一款引擎对于图形渲染的处理方式都不同,所以用某个引擎编写出来的游戏,具体的表现画面也会不同。比如,有的引擎编写出的光影效果特别绚丽,有的则粒子效果特别真实。
游戏引擎是一整套游戏解决方案。其实,游戏引擎并不仅仅等同于图形引擎。图形引擎只是游戏引擎中一个占比极大的组成部分。一款好的游戏引擎,不仅要看它对于图形图像的处理能力,也要看它对于其他部分的处理能力,比如对音频、音效的播放、键盘鼠标的处理,以及 UI 界面的编辑和各种处理工具的提供。这里的处理工具包括地图编辑器、关卡编辑器、人物编辑器、资源编辑器、物理碰撞、碰撞检测等。所以,从专业的角度讲,游戏引擎是完成开发一套游戏的解决方案,而不仅涉及图形部分。
游戏引擎是一整套编程接口。要写游戏就必须写程序,所以有游戏引擎就一定需要编程。不管你是直接面对引擎编写代码,还是在引擎提供的编辑器(比如关卡编辑器)基础上编写简单的逻辑代码,写代码都是必不可少的。在引擎提供的编程接口上,你能很容易地调用各种接口完成游戏的开发。

游戏引擎是怎么工作的?

说完了游戏引擎是什么,我们来看游戏引擎具体是怎么工作的。
我先从代码层面来说。这里是一段伪代码:
int DrawLine(const Surface& s, int sx, int sy, int fx, int fy, int fit, const Color& color);
这段伪代码提供了一个在屏幕上画一个线条的函数。该函数提供了 7 个传入参数,分别是:
目标图层
线(在游戏窗口内)的起始 x 点
线(在游戏窗口内)的起始 y 点
线(在游戏窗口内)的终止 x 点
线(在游戏窗口内)的终止 y 点
线条粗细
线条颜色
在调用了这个函数之后,你就能很容易在屏幕上画出一个线条。同时,在这个函数背后,引擎做了一系列这样的动作:
判断传入的 Surface 图层对象是否正确、是否存在;
判断传入的起始点、终止点是不是存在负数;
判断颜色是不是正确;
拆分 Color 变量为 RGB 值,填入到 SDL 绘图接口,调用 SDL 绘图接口绘制一条线。
关于绘图接口,我会在下一节的内容中详细讲解。这里,你只需要知道,画线的接口函数在背后分解、组合、计算,然后会将绘制工作交给底层绘图接口就可以了。
之所以要拿这个画线函数举例,是因为它展示了引擎中函数的使用方式。如果我们用一般的画线函数画圆,那首先要知道圆的直径和计算方式;如果画矩形,那就要知道哪里是起始点和终结点。这一系列动作等于将引擎所做的工作包含在了画线函数里,你只需要关心画线的这一系列参数如何使用就可以了。
说完了代码层面,我们来说说非代码层面的东西。
游戏引擎其实也包括游戏开发的一系列工具,也就是诸如地图编辑器、关卡编辑器、人物编辑器、资源编辑器等。美术、策划、制作人等,这些开发流程中的责任人,可以往工具内填入需要的东西,制作出需要的内容。
我们拿人物编辑器来举例。如果我们使用通用编辑工具(比如 3DMAX、Maya 等)编辑出来内容,需要经过格式的转换才能应用到游戏中,但是这样不仅耗费转换时间,也耗费调试时间。因为通用工具可能并不适合引擎本身所定义的格式,需要不停修正和更改。如果引擎本身就提供了这样的制作工具,那么制作出的内容直接就能在游戏中使用,不需要转换,所见即所得。
所以,游戏引擎背后的工作方式是:
在代码层面,游戏引擎是对绘图接口、操作系统、音频等接口进行的代码层面的封装;
在工具层面,游戏引擎是一整套游戏内容的制作工具,方便你制作针对这个引擎的游戏内容。

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

了解了游戏引擎的概念和工作方式,那么开发者究竟是自己编写引擎还是购买商业引擎比较好呢?
从一般意义上讲,如果有实力,当然是自己开发引擎更贴合公司的情况。然而,这样付出的代价就是,花费大量的人力和财力,而且,以一般小公司或者起步阶段的开发者的开发水平,编写出的引擎,很可能只是一个半成品或者问题多多的残次品。自研引擎并不是一个不可能完成的任务,但是要看公司的财力和程序员的实力。
购买商业引擎是现在大部分公司都会走的一条路。购买商业引擎只需要花费一笔钱就能拿到成熟的游戏引擎,直接可以开发游戏,然而付出的代价就是,你可能需要从头开始学习这套引擎的工作原理、工具套装。
如果你非常熟悉 3DMAX 等通用工具,那要从头学习开发工具,就会产生许多问题,比如:
引擎中包含的开发工具基本没有通用性可言。就算吃透了工具,对你今后的能力提升和职业规划也没有明显的帮助;
如果引擎升级或者更换引擎,就需要从头再学一次工具,会耗费大量时间和精力。当然会有一些优秀的商业引擎支持通用工具制作的内容导出和转换,直接在引擎中可以使用,当然这种引擎的购买费用也会更高;
另外,商业引擎本身也会存在一些隐藏得很深的 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 编写的。

小结

好了,这一节内容差不多了,总结一下,我主要给你分享了四个内容,分别是游戏引擎的定义、游戏引擎的工作方式、游戏引擎的选择和编写。
你只需要记住以下这些内容即可:
游戏引擎是一整套的游戏开发程序接口和开发组件,可以让你更方便、更专注于游戏的开发;
游戏引擎控制着游戏的几乎所有内容,游戏的表现质量和游戏引擎直接相关;
针对不同的平台,游戏引擎所使用的编程语言也不一样。而了解了游戏引擎的编写,在之后的开发过程中,会有非常多的便利。
最后,给你留一个思考题:
什么情况下,我们可以跳过游戏引擎,直接编写一款游戏呢?
欢迎留言说出你的看法,我在下一节的挑战中等你!
分享给需要的人,Ta购买本课程,你将得18
生成海报并分享

赞 4

提建议

上一篇
第2讲 | 2D游戏和3D游戏有什么区别?
下一篇
第4讲 | 底层绘图接口的妙用
 写留言

精选留言(38)

  • DeathKnightH
    2018-05-31
    文中也说到了,游戏引擎中占比极大的一部分是图形引擎,所以我觉得制作的游戏如果对图形渲染没有要求,可以绕过游戏引擎。
    共 1 条评论
    27
  • 宋桓公
    2018-06-26
    没钱买引擎的时候
    16
  • Geek_King@技术爱好者
    2018-05-31
    纯文字游戏 😊
    9
  • Kun
    2018-05-31
    当游戏引擎给你带来的优势并不明显时,可以跳过 比如你想通过做一个扫雷来熟悉C语言,那直接用printf打印整个雷区就行,有没有引擎对主目标影响不大 再比如你要做个demo验证游戏性,可能简单的基于字符的交互就能满足需求,那也就没必要上图形引擎了
    展开
    6
  • 974
    2018-06-04
    游戏引擎是不是相当于框架?

    作者回复: 确切地说,是游戏解决方案

    共 2 条评论
    5
  • 管理员
    2018-06-01
    不知道什么样的游戏可以跳过引擎。请老师公布答案。

    作者回复: 有人回答的不错,简单的游戏,比如围棋象棋,之类的,可以直接写。

    4
  • third
    2018-06-10
    反过来理解就行了, 引擎提供了图像,音频,键盘等解决方案。 那就没有这些的就可以。纯靠逻辑的游戏
    3
  • hardcoreYutian
    2018-10-02
    老师发给我们的用scratch编的小游戏
    1
  • lalin
    2018-06-01
    使用的框架本身已經支援大量的圖片和聲音等遊戲相關的調用方法
    1
  • Anubis
    2018-05-31
    文字为主的游戏
    1
  • 学员11
    2022-10-14 来自北京
    简单的游戏不需要引擎,能把东西做出来就行了
  • 丫头
    2022-09-14 来自广东
    游戏引擎多种多样,行业新手应该如何选择呢?
  • Eden Ma
    2022-07-03
    使用像RPGMaker那种只需要操作图形的工具时候可以跳过,这样可以使用现成的内容进行组合。不过上限很低。
  • 神马*涛💋
    2021-09-06
    控制台游戏,可以不依赖于游戏引擎,但是做出来的效果有限。当我们有源码的时候可以直接搭建
  • 阿钊正传
    2021-03-13
    不是电子游戏的游戏都可以跳过引擎直接编写。比如狼人杀,密室逃脱,其他桌游和文字游戏之类的
  • louis
    2020-10-20
    游戏引擎是一套sdk和配套的开发工具。 用java语言来对比,就像是jdk和eclipse开发工具这样吧。
  • 霁雯
    2020-05-05
    制作一个比较简单的游戏,如2048
  • Eden Ma
    2020-01-29
    移动端可以通过图片和逻辑实现一些简单的游戏,比如当年的tom猫就是一堆图片配合手势播放而已. 还有一种情况就是使用RPG制作大师或者游戏内部编辑器这种图形编辑工具来设计游戏
  • 山东人儿
    2019-07-29
    这么看来游戏引擎算是开发工具了。 那游戏引擎也是游戏运行的基础吗,玩家下载的游戏里面有没有这个游戏引擎?
  • 2019-06-03
    大概类似于微信小游戏的跳一跳 这种 应该可以不需要游戏引擎吧。大概就是比较简单的,画面和音效,地图等要求不高的游戏。