Isetta:从头开始编写游戏引擎

2020-11-29 08:14:17

Isetta Engine是一个学生驱动的项目,旨在使游戏引擎开发神秘化,并为新手开发人员提供路线图和相关知识。为此,我们的团队将自己从一个基础框架集合中创建一个游戏引擎,并通过定期的博客记录过程,陷阱和对听众的建议。除此之外,我们还将与经验丰富的专业人士进行访谈,以扩大我们的新手视野。我们相信博客中的新手观点和访谈中的专家观点将很好地融合在一起,并形成一个完整的文档来帮助人们入门。

我们认为在该领域需要做更多工作的原因是,太多的游戏引擎开发人员等到引擎完成(通常是数年)才能谈论他们的开发。对于工作室来说,这是因为他们认为最终产品是游戏,而不是引擎。对于其他人,可能是因为引擎是他们认为有价值的东西,而不是文字。结果,这些谈话通常失去了在发展过程中发生的实际日常斗争的细节。还有其他人记录了他们已经发展了多年的发展,这对于新来者来说是艰巨的任务。

尽管该项目旨在帮助新手开发人员,但它不能用作学习引擎开发的唯一来源。作为我们自己的新引擎开发人员,我们不能保证我们开发引擎的方式是正确的,这就是为什么面试将帮助项目立足的原因。这意味着正在学习的其他人可以使用我们所做的工作作为指导,而不必一定是地面真理。博客将不会提供有关如何开发引擎的演练/教程/分步说明。我们正在学习,并认为我们的旅程对您来说可能是有价值的。

该项目是作为娱乐技术中心(ETC)的学生计划项目而完成的。 ETC是卡内基·梅隆大学(Carnegie Mellon University)的跨学科硕士学位课程,学生的主要重点是每个学期在三个月的时间里在一个项目中组成小型团队。在整个学期中,团队的工作将呈现给教师和同龄人,并提供反馈和批评意见,以帮助项目开发。我们特定的项目构想经过多次迭代来执行以下操作:

在撰写本文时,我们已经了解到创建既要满足又要耗费时间的内容,因此我们将专注于编写这些里程碑式的博客以及发布各种类型的内容以进行测试,这是最好的形式介绍我们的工作。较短的项目持续时间也迫使我们在开始之前就清楚地考虑我们的范围并依靠我们所包含的功能。

在此项目的过程中(2018年8月26日至12月16日),每周将发布一篇博客文章以分享我们的想法和过程,并且每1-2周将发布一次访谈。采访时间表取决于我们在引擎本身上的进度,因为每个采访的主题都将围绕我们当前的工作进行。

尽管我们将介绍引擎开发的一些基本功能,但是如果您有C ++编程和开发软件(尤其是游戏)的经验,它将对您有深远的帮助,因为我们的项目不会提供有关如何做所有事情的分步说明。有关如何获取相关知识的资源列表,请转到“阅读材料”部分。其他资源将发布在我们的资源页面上。

另一个先决条件是学习游戏引擎开发的热情。当您仍在阅读本文时,我们假设您对此感到兴奋。这将是一个颠簸的旅程,但是您会让我们站在您的身边。

作为一个由学生参与的ETC项目,意味着该项目需要经过一系列的咨询和说服力老师的推销程序。这使我们能够收到有关什么可以被认为是合理/可管理的范围以及在什么地方可能遇到一般项目挑战的反馈。为了使该项目成为有效的ETC项目并完成我们的任务说明,在文档和开发之间必须保持良好的平衡。

在面对引擎开发和文档编制的庞然大物之前,我们认为最好从实际做到这一点的人那里征求意见,这是一个好主意。在推销过程中,我们伸出了援助之手,有机会与众多行业专家交谈,并从他们那里获得了非常有用的建议。所有这些建议帮助我们将项目塑造成现在的样子,并提供了有关如何启动游戏引擎的宝贵知识。因此,我们也鼓励您与专业人士取得联系,并在可能的情况下寻求建议。我们已将与他们的交谈中的笔记整理成一篇文章,并将很快发布。

使用现有的游戏引擎(如Unity,Unreal或Panda3D)始终是制作游戏的便捷选择。这些完善的引擎拥有大量的工具和API,因此开发人员可以专注于制作游戏,而不是专注于制作游戏。但是,存在局限性,即不能完全控制引擎中的所有系统,也不知道引擎如何处理游戏逻辑和资产。这些可能会阻碍引擎的复杂系统,因此,尽管您可能了解物理引擎或图形引擎的工作方式,但每个引擎的操作方式不同,并针对不同的约束进行了优化。

就学习游戏引擎以及如何开发游戏引擎而言,这些既定的引擎并不是一个很好的来源。 Panda3D最初由迪士尼开发,并通过过去的ETC项目进行了扩展,在2018年具有较旧的代码库,社区参与度有限。它还没有使用当前的行业标准语言(C ++)。 Unity和Unreal既庞大又过于前沿,因此不适合新手学习引擎。另外,Unity的源代码不是公开可用的,因此从技术上您不能从中学习。庞大的代码库为任何初学者入门设置了很高的门槛。

Isetta Engine将支持最原始形式的网络多人双杆射击游戏。之所以选择网络多人游戏作为引擎的一部分,是因为它在项目的每个层次上都提出了重大的设计和开发挑战,并将帮助使该引擎与正在开发的其他引擎区分开。我们决定以3D方式创建引擎的原因有两个:大多数AAA引擎都是3D,并且3D需要更多的数学知识和解决问题的能力,供开发人员学习和成长。

在进行规划时,在我们对游戏引擎了解不多之前,我们对游戏引擎的组成有了基本的了解。下图显示了Isetta引擎的外观的第二/第三次迭代。最初我们只是天真地认为我们可能既可以进行网络连接又可以进行物理连接,但是很快就陷入了难以解决的问题。音频和图形曾经而且现在仍计划从外部库中导入,有关导入内容和原因的更多讨论将包含在将来的博客中。该引擎图很快将被更深入的解释所取代。

至于我们选择的双杆射击游戏类型,是在长期考虑构建其他游戏类型所需的组件以及该类型将如何利用多人游戏之后做出的决定。双杆射击者实际上可以拥有很少甚至没有物理学,这与碰撞不同(这将在第1周的博客中进行解释)。同样,在网络会话之间传递的信息相对较少,并且对延迟的要求也不太严格。更重要的是,双杆射击游戏专注于不需要世界编辑或过多设计的简单游戏玩法。

在Skype会议上,沃尔特·德斯特勒(Walt Destler)向我们解释说,每种游戏-尤其是每种游戏-都需要完全不同的网络代码解决方案。这也是为什么我们更喜欢网络代码而不是物理的原因之一,因为它可以极大地缩小类型的选择范围。例如,多人射击游戏,特别是PvP射击游戏,需要少量的信息(即子弹和玩家位置)从服务器传递到客户端,且时延相对较低。 PvP射击游戏还可以具有客户端预测1的功能,以及通常需要2个以上玩家进行游说/配对的附加要求。另一方面,类似“回合制”策略的类型要求将大量信息(所有单元,决策,资源等)传递给所有用户,而不必过多担心延迟或预测。

我们经常从专业人士和我们的老师那里听到的另一条建议是与引擎一起开发游戏的好处。他们解释说,这样做可以使您证明并证明您的发动机按预期工作。游戏还可以测试功能以显示引擎的即时情况。

开发引擎的另一个好处是,当您继续扩展最终产品中不会使用的某些功能时,可以防止功能爬行。用此引擎构建的游戏不会是原创的,也不一定是有趣的。但是,这并不是说不能通过此引擎创建有趣的原始游戏。我们的示例游戏的想法是有意进行衍生,因此基本双杆射击游戏的功能将已经包含在引擎中,而不仅仅是我们在小众市场上的特定功能。

如前所述,我们正在制作的游戏是一个简单的双杆射击游戏,让人想起您第一次学习游戏开发时会创建的游戏。它是《使命召唤:黑色行动:死亡行动》街机模式的一种简单衍生形式,尽管没有很多《使命召唤》精巧多汁的游戏玩法。我们已经在虚幻中开发了游戏的一个版本,我们将复制并使用它来将功能与我们的游戏引擎进行比较。我们将能够在游戏的虚幻版本中创建场景,然后在游戏的Isetta Engine版本中进行复制。拥有已经构建好的游戏版本可以使我们不必担心实际游戏的逻辑或设计,因此我们可以专注于引擎,精确地执行游戏当前的工作。它还使我们能够将资产从游戏的虚幻版本直接拉到Isetta引擎,而不必担心不良资产。换句话说,如果它可以在虚幻引擎中运行,那么它应该可以在Isetta中运行,因为这是我们的最小可行产品(MVP)。

由于该项目已经是一项艰巨的任务,而且工作时间很短,因此我们根本不可能为引擎的每个部分编写代码。如果您查看行业工程师职位,您将不会看到任何人为整个引擎编写代码,因为团队通常是数十到数百人。但是,团队中每个人都需要知道如何做的是集成和使用其他人创建的库。以下是我们的引擎计划,它分为七个简化过的组件:

核心系统:软件开发人员将更熟悉的所有其他代码

在这些组件中,第1个将有少量导入的库来解决我们认为如果编写它们不会对我们或引擎有利的问题; 2个将纯粹是导入的库,因为单独的图形可能会占用整个3个月的时间(尤其是3D和动画);和3将使用现有的探查器,因为由于缺少UI设计,我们的探查器的简化版本最终可能无法使用。但是,所有其他系统将在Isetta Engine中从头开始实施,如果您按照我们的旅程进行,则可能由您实施。

创建引擎可能是一项艰巨的任务,尤其是考虑到没有明确的起点时。当我们开始这个项目时,我们期待其他人去了解如何进行指导,但是我们收到了既艰巨又密集的大量教科书。像我们一样恐惧,我们读了一些这样的书和博客,以便更好地掌握在如此短的时间内开发引擎的方法。我们强烈建议您阅读其中的一些书,或者至少阅读其中列出的章节,因为它可以使您更好地理解我们所使用的语言以及我们想要达到的目标。这些博客的目标是能够解释我们在做什么以及为什么这么做。但是,我们不会介绍“如何”,因为开发可教学的内容需要花费时间。这绝不是引擎手册和资源的全部清单;这只是我们使用过的/认为可能最有用的。其他资源可以在这里找到。

游戏引擎架构:这是权威的游戏引擎书,由Naughty Dog的Jason Gregory撰写。它向读者展示了什么是游戏引擎,并且对每个主要组件都有完整的讨论。我们的团队阅读了本书的第二版,因为第三版刚刚于2018年7月发布。为了简要了解游戏引擎本身,特别推荐第1、4、5、7、14、15章。

游戏编程模式:设计模式是软件工程中常见问题的通用且可重用的解决方案。游戏开发与该领域共享一些概念,但是有其自身的问题。本书易于阅读,不仅涵盖了经典的设计模式,而且还介绍了游戏特定的设计模式。我们认为,最重要的模式是:

C ++之旅:即使对于有经验的程序员,现代C ++始终很难遵循。本书是C ++的创建者Bjarne Stroustrup撰写的一本精简手册,专为以前进行过编程的开发人员设计,并概述了现代C ++(C ++ 17)。

有效的C ++系列:该系列书籍提供了C ++的最佳实践,并涵盖了C ++开发中使用的大多数内容。它可以极大地提高代码质量,并有望减少StackOverflow搜索。

手工制作的英雄:手工制作的英雄是一个正在进行的项目,旨在从头开始创建一个完整的,专业品质的游戏。开发人员Casey Muratori可以流式传输每一行源代码的创建,并且视频也可以在Youtube和Handmade Hero网站上找到。

Gaffer On Games:这是Glenn Fiedler的博客网站,他深入介绍了游戏主题,主要侧重于物理和网络。更好地理解晦涩的话题,或者只是了解一些您不知道的东西,这可能是一个很好的资源。

Red Blob游戏:Red Blob的作者Amit Patel旨在通过游戏的镜头教授数学和计算机科学主题。他的博客在教育与游戏密切相关的主题方面做得非常好,并在整个页面中提供了交互式示例,以增强阅读效果。

如何编写自己的C ++游戏引擎:该博客与我们将尝试编写的博客最为相似,但是间隔更固定。它谈到了Jeff Preshing在编写自己的游戏引擎时所经历的旅程,他所遇到的一些建议和细微差别。

CppCon 2014:Mike Acton“面向数据的设计和C ++”:Mike Acton讨论了为何面向数据的设计比面向对象的设计更适合于程序视图,以及为什么要处理特定硬件和非常低端的现实。从层次上讲,面向平台的优化比理论抽象更为真实。在整个演示过程中,Acton讨论了代码设计的三大谎言以及程序员应采取的纠正措施。

截至目前,我们的团队已经完成了引擎和子系统的初步架构设计,这些引擎和子系统将从第三方库中实现或导入。引擎开发已经在进行中,在下周的博客中,我们将分享有关架构的设计过程和开发路线图。

除了Isetta Engine开发之外,下周还将与Schell Games的高级游戏工程师Adam Serdar进行首次采访,敬请期待!

约翰·卡马克(John Carmack):“我现在允许客户端猜测用户移动的结果,直到服务器发出权威响应为止。这是一个重大的体系结构更改。客户端现在需要了解对象的坚固性,摩擦力,重力等我痛心地看到优雅的客户端为终端设置走开,但我上面理想主义的实践。”有关更多信息,请参阅:游戏专家:每个程序员都需要了解的游戏网络