伊塞塔引擎开发实录第 0 周:预备工作

作者:Isetta
2018-09-18
24 15 3

引言

ETC 项目伊塞塔引擎开发实录。欢迎访问我们的博客阅读英文版本,中文版本目前在 indienova 站内独家连载。

项目介绍

伊塞塔引擎是由学生推动的游戏引擎开发项目,旨在阐明游戏引擎开发奥秘,为新窥门径的开发者提供路线图及相关知识。为达成这一目标,我们的团队将亲自制作一款游戏引擎,完成一系列基础框架,整理开发进程文档,进行缺陷测试以及定期撰写博客为读者朋友提供指导。除此以外,我们还将采访经验丰富的专家来深化我们作为入门者的观点。我们相信,博文中的新手观点和访谈中的专家观点将能够有机地构成一份完整文档,来帮助新的开发者入门。

这个领域还有许多工作尚待完成,因为有太多的引擎开发者在完成引擎后才开始讨论他们的工作,而这通常需要数年之久。对游戏工作室来说,这是由于他们考量的最终产品是游戏,而非引擎。对其他一些人来说,则是因为引擎的价值在于其本身,而非围绕它的文档工作。这导致了这些讨论通常会遗漏实际开发过程中经常出现的日常抗争。而另一些人的文档则是为已经进行数年之久的项目准备的,对入门者过于晦涩艰深。

尽管本项目主要目标是帮助新手,但它并不适合作为学习引擎开发的单独参考。我们本身也是新入门的引擎开发者,无法保证这款引擎的开发遵循了正确的方法,这也是我们设立访谈环节的原因,它能够保证这个项目能脚踏实地地做下去。换言之,学习引擎开发的人可以将我们的实践作为指南,但不必视之为颠簸不破的真理。这个博客系列也不会成为指导引擎开发的流程、教程或是步骤详明的手册。我们也在一边推进一边学习,思考我们的开发之旅到底能够为读者带来什么样的价值。

计划目标

本项目为 ETC(娱乐技术中心,英文为 Entertainment Technology Center)旗下的学生项目。ETC 是卡梅隆大学的跨学科硕士项目,入学者将以小组形式,每学期进行一次为期三月的项目。整个学期过程中,小组的工作将呈现给教师与同学,以接受反馈和批评,来帮助这个项目发展。我们的项目则将历经多次迭代以求完成下列目标:

  1. 简化引擎的设计和开发方案,以便适应为时三月的项目周期;
  2. 力求交付的成果是有价值的,并希望能够令参阅者觉得有趣。

在写下这些目标时,我们已经意识到,创作满足多方面要求的内容既困难亦耗时,所以我们将在专注于撰写这些里程碑类型的博客的同时,尝试发布不同类型的内容,寻找呈现我们工作的最佳形式。而并不充分的项目周期也迫使我们清晰地考量涉猎范围,在开工前就确立我们希望包含的内容。

日程规划

项目进行期间(2018年8月26日到同年12月16日),我们每周会发布一篇博客,用于分享我们的思考与项目进展;而访谈发布的频率则是每一到两周一次。访谈的计划需要视开发进度而定,而每期访谈主题也将围绕我们当前的开发工作来进行。

预备知识

尽管我们打算囊括引擎开发一些最为基础的内容,但是,假如你已经具备一定的 C++编程以及软件开发、尤其是游戏开发的经验,毫无疑问将可以收获得更多。毕竟,我们也并不会对项目的每个细节都提供步骤清晰的讲解。在本文的相关文献一节中,你可以找到获取相关知识的参考资料。

另外,学习游戏引擎开发的热情也是必不可少的先决条件。既然你还在继续读这篇博客,我们会假定你对我们的工作激情十足。这场“其修远兮”的旅程,我们将与你同行。

项目调研

作为学生驱动的 ETC 项目,本项目需要通过一系列 ETC 项目内的教师咨询与答辩。这使得我们能够收到相关的反馈,既能考量项目所涉及范围的合理性与管理难度,也能尝试进行对整个项目而言算是挑战内容的部分。为了让本项目能够成为一个有效的 ETC 项目,也为了完成我们声明的目标,需要仔细平衡文档工作与开发工作的权重。

在直面引擎开发与相关文档工作这项艰巨挑战前,我们都觉得如果能从有实际经验的前辈那里吸取经验将会大有裨益。投递本项目的过程中,我们联系了许多业内的专家,并得到了与他们对谈的机会,从他们那里,获取到了许多极为有用的建议。这些建议不仅帮助我们确立了目前项目的方向,也为如何开始开发游戏引擎提供了有价值的知识。因此,我们也鼓励你尽可能尝试联系专业人士来获取建议。我们将这些访谈内容也做了文字整理,很快也会将它们发表出来。

为什么需要开发新的引擎

使用 Unity、虚幻(Unreal)或者 Panda3D 这些已有的引擎来开发游戏无疑是便捷的选择。这些被广泛接受的引擎通常包含强大的工具链和 API,能够让开发者专注于游戏制作本身,而无需重复发明轮子。然而,这些引擎会有所限制,你既无法对它全部的系统充分调控,也很难掌握它如何处理游戏逻辑和资源。这些问题可能在面对复杂系统时带来阻碍,因为即使你了解物理或者图形引擎的基本原理,每一种引擎的实现方式和面对不同约束所进行的优化也是有所区别的。

因此,当我们的目标是学习引擎原理以及学习如何开发游戏引擎的时候,这些被广泛接受的引擎就不再是最合适的资源。Panda3D, 最早由迪斯尼开发,之前的 ETC 项目曾扩充过它的功能,在社区参与十分有限的情况下,它的代码在2018年来看已经有点太老了。它也没有使用目前的业界标准语言(C++)。而 Unity 和虚幻则都过于庞杂和前沿,不宜作为新手学习的材料。这些成熟引擎过于庞大的代码对新手设置了过高的门槛。此外,Unity 的源码并不对公众开发,理论上我们也无法通过它来学习。

开发路线图

伊塞塔引擎将为多人联机双摇杆射击游戏提供最为原始的支持。我们将多人联机纳入引擎的功能范围,是因为,无论在项目的哪一个层面,无论是从设计角度,还是开发方面,多人联机功能都能带来显而易见的挑战,这也是这款引擎与其他一些正在开发中的引擎的差异之处。而我们选择开发3D 引擎的原因则有两个:首先,多数3A 游戏都是3D 游戏,其次,开发3D 引擎能给我们这些开发人员带来更多的收获和成长,它会需要我们运用更多的数学知识,克服更多的技术困难。

项目策划期间,我们对游戏引擎还了解甚少,这张示意图展示了我们当时对一款游戏引擎所包含内容的基本理解。它基本上是伊塞塔引擎历经第二次或者第三次迭代后的样子。最初,我们希望把物理引擎和联网都纳入项目范围,但很快就意识到控制项目规模的必要性。音频和图形的部分我们仍计划通过外部程序库来实现,这类引擎内容范围的讨论(要实现什么?为什么要实现这些功能)我们都会将其包含在未来的日志内容当中。而这张引擎示意图则会很快就用更深入的阐释加以扩展补充。

类型的选择

我们投入大量时间考量了其他类型游戏的引擎所需的组件,也慎重思考了引擎功能将如何与多人联机模式结合,最终决定尝试制作面向双摇杆射击类型游戏的引擎。双摇杆射击游戏显然对物理部分所需甚少。我们这里所指的物理系统,有别于碰撞系统(我们会在之后的博客中详细解释)。同样,网络会话所需要传输的数据也相当少,对延迟要求也不算高。更重要的是,双摇杆射击游戏能够专注于规则极简的玩法,不需要我们花费时间研究地图编辑器或者投入太多精力做其他方面的设计。

在一场 Skype 网络讨论中,Walt Destler 向我们解释道,每款游戏,更确切地说是每一种游戏类型,对网络联机的代码实现是大相径庭的。联机部分的要求会很快把游戏类型的选择缩小到一定范围之内,这也是为什么我们会把工作重心地更多放在联机实现,而非物理系统上。例如,多人射击游戏,尤其是玩家对战(PvP)的射击游戏,会要求服务器向客户端发送少量的低延迟数据(如子弹和玩家的位置)。此外,玩家对战射击游戏还会在客户端进行一些预判处理(注1),并且会需要一般来说会有超过两名玩家参与的联机大厅或在线匹配等功能。而另一方面,例如回合制策略游戏,则需要向所有用户传输大量的网络数据(兵种单位,决策,资源的信息等),而无需太过考虑延迟或客户端预判问题。

游戏实例

我们还经常从专家和老师那里听到在引擎开发过程中同时开发一款游戏的好处。他们解释说,这样不仅能够验证和演示引擎是否能如同预期工作,也能方便对引擎功能进行即时的极端测试。

此外,这还能阻止我们把大量精力投入给一些难以整合进最终产品的功能。实例游戏在玩法上可能并非独创,也并不足够有趣。然而,这并不是说这款引擎无法用于开发独创且有趣的作品。我们有意选择一款衍生作品作为示例游戏,以囊括一个最基本的双摇杆射击游戏所需的内容,而非仅仅局限于实现我们经验范围内的某些特定功能。

如前文所述,这款实例游戏将会是一款简单的双摇杆射击游戏(带有强烈的习作感)。它是《使命召唤黑色行动:死亡行动》(Call of Duty Black Ops: Dead Ops Arcade mode)的衍生作品,但玩法效果上并不会打磨到原作的水平。我们之前已经用虚幻引擎开发出了一个版本,之后会用我们的引擎重新实现它,并且用于对比两款引擎的功能。先开发其他引擎的版本,能够让我们不必分散精力考虑游戏的具体设计和业务逻辑,而是专注于研究游戏中使用功能实现所对应的引擎功能。此外,能够复用游戏素材也是优势之一。总而言之,虚幻版本有利于检验我们的游戏引擎的功能实现,而这款游戏则将成为我们的最简可行产品(MVP)。

引擎组件

由于这个项目已经是一个十分庞大但限时很短的项目,我们几乎不可能为引擎的每个部分都编写代码。如果你将自己代入业界来观察,会发现,现在几乎没人独立开发整个引擎,大多项目都有数十乃至上百名成员在投入心血。但是,我们团队中的所有人都知道,我们需要集成和使用其他人开发的程序库。以下是我们将整个引擎开发拆解后分成的七个有些过于简化的部分:

  1. 核心系统:万物之源,底层代码,软件开发者可能会更加熟悉;
  2. 图形,音频,输入; 
  3. 引擎工具:帮助我们调试和分析游戏; 
  4. 资源管理:游戏运行之前如何处理文件; 
  5. 玩法基础:引擎如何连接游戏逻辑; 
  6. 碰撞:但并不实际进行物理计算; 
  7. 网络:引擎将支持多人游戏,这部分会贯穿始终;

针对各个组件:第1部分的内容,我们会引入部分外部程序库来帮助解决问题,尤其是当实现其中一部分环节对我们和引擎来说收获并不大的时候。第2部分的内容,我们会完全依赖外部程序库来实现,因为图形部分并非一个三个月长的项目能独立完成的部分(尤其是涉及3D 场景和动画相关的问题)。第三部分的内容,我们会使用已有的调试工具,因为我们自己编写的简化版本缺乏 UI 设计,并不好用。其他系统,我们将在伊塞塔引擎中从头实现。如果你追随我们的更新,也将体验到整个开发过程。

相关文献

开发引擎是一项艰难庞杂的工作,尤其是考虑到我们并没有清晰的切入点。在开始这个项目时,我们曾尝试了解其他人的工作,希望能获得一些参考,却发现迎接我们的是汗牛充栋、繁杂密集的文本。尽管如此,我们还是参阅了其中部分书籍和博客文章,以求更好地了解怎样在如此短的时间内开发出一款游戏引擎。我们强烈推荐你们阅读其中的部分书籍,或者至少是我们列出的部分章节。它将能够帮助读者对我们所使用的语言以及所要完成的工作产生更清晰的理解。我们撰写这些博文的目标也是解释我们所做的开发工作的内容和原因。但是,我们并不会涉及到太具体的细节,因为将开发内容整理为适合教学的资料会花费太多时间。最后,这份清单并未全面系统地整理出引擎开发的书籍和学习资料,它只是我们参阅过,并且觉得最为有用的一部分资料的整理。

书籍
  • Game Engine Architecture:由顽皮狗工作室的 Jason Gregory 撰写的权威游戏引擎开发书籍。它不仅向读者揭示了游戏引擎的主要内容,还全面地探讨了引擎各主要部分的内容。我们的团队参考的是本书的第二版,因为第三版2018年七月才刚刚出版。推荐阅读本书的1,4,5,7,14,15章节,可以对游戏引擎本身有一个基本的了解。
  • Game Programming Patterns:设计模式是指软件开发过程中对常见需求提出的通用可复用解决方案。游戏开发在这方面也有类似概念,但也会产生自己的新问题。这本书非常易于阅读,不仅带我们温习了经典的设计模式,也介绍了一些针对游戏开发的设计模式。我们认为最需要了解的设计模式主要有下列这些:
  • A Tour of C++:即便是对于经验丰富的程序员,也很难追随现代 C++的最新发展。这本来自 C++之父,Bjarne Stroustrup 的小册子主要面向有过一些编程经验的程序员,旨在帮助他们快速浏览现代 C++(C++17)的主要内容。
  • Effective C++ Series:这套书籍整理了许多 C++编程的最佳实践,覆盖了 C++编程最为主要的内容。它能够极大地提升代码质量,有希望减少大家在 StackOverflow 上搜索求助问题上花费的时间。
博客
  • 手制英雄(Handmade Hero):仍在进行当中的手制英雄(Handmade Hero) 计划将不依赖现有引擎,从零开始开发一款完成的专业品质的游戏。开发者 Casey Murator 用视频记录了游戏开发过程中所撰写的每一行代码,读者可以在 Youtube 或者游戏的官网找到这些视频。
  • 游戏老兵(Gaffer On Games):Glenn Fiedler 的博客,专注于撰写游戏开发所使用的物理引擎和网络编程相关的深度文章。深入学习相关课题的好资源,同时也能够让你接触到很多从未了解过的新知识。
  • Red Blob Games:在这个博客中,Amit Patel 试图以游戏为载体诠释数学和计算机科学的知识。文章不仅内容扎实,除了阅读文本以外,还提供了可以在网页中交互的范例。indienvoa 站内有其部分文章的中文版本。
  • 如何编写自己的 C++引擎:很类似我们正在撰写的内容,不过更新周期更固定,它记录了 Jeff Preshing 开发自己游戏引擎的过程,提供了一系列建议,以及他遇到过各种细微的差异情况。
视频
  • CppCon 2014: Mike Acton "面向数据设计与 C++":Mike Acton 探讨了为什么面向数据设计优于面向对象设计,为什么处理特定的硬件问题以及进行非常底层面向平台的优化要比理论抽象更加实际。在演讲中,Acton 探讨了编程设计中的三大谎言,并且指出程序员应当采取怎样的行动来纠正这些谎言。视频地址见这里,访问时请自备魔法工具。

内容预告

目前,我们的团队已经完成了引擎最为初步的架构设计,很快就会着手实现子系统,并开始引入一些第三方程序库。引擎开发已经在进行当中,我们之后的博客更新会为大家分享引擎架构的设计进度和开发路线图。 除了伊塞塔引擎的开发外,我们采访了 Schell games 的高级游戏工程师,Adam Serdar,第一篇采访报道很快就会推出,敬请期待!请持续关注我们的博客或 indienova 网站。

备注

  • 注1: 约翰·卡马克:“除非收到服务器传来的认证回复,我不会允许客户端直接使用预判的用户操作。这是十分巨大的架构改变。客户端现在需要知道对象是否有实体,有无摩擦,是否受重力影响等等。优雅的客户端即终端方案一去不返,虽然我很难过,但我毕竟是个实用主义者,而非理想主义者。”更多相关信息可以查阅这篇文章:《游戏老兵:程序员应当了解的游戏网络编程知识》

近期点赞的会员

 分享这篇文章

Isetta 

https://isetta.io 为新手开发者揭开游戏引擎开发的神秘面纱  

参与此文章的讨论

  1. 时光汹涌而来 2018-09-18

    还更新么?坐等更新。

    • Zacks 2018-09-19

      @时光汹涌而来:会更新哦,英文版的第一周和第二周已经在网上啦,第三周也正在写

  2. WonderBoy 2018-09-18

    期待后续

您需要登录或者注册后才能发表评论

登录/注册