科技>计算机>网络与互联网
游戏引擎架构(第2版)

游戏引擎架构(第2版)"

作者:叶劲峰
ISBN:9787121375293
定价:¥219.0
字数:1361千字
页数:972
出版时间:2019-10
开本:16开
版次:01-01
装帧:
出版社:电子工业出版社
简介

《游戏引擎架构》(第 2 版)涵盖游戏引擎软件开发的理论及实践知识,并在第 1 版的基础上对多个主题进行了更新。本书中讨论的概念及技巧被实际应用于现实中的游戏工作室(如艺电及顽皮狗)。虽然书中采用的例子通常依托于一些专门的技术,但是讨论范围远超某个引擎或API。另外,书中提供的参考文献及引用也非常有价值,可让读者继续深入游戏开发的任何特定方向。本书为大学程度的游戏编程课程而编写,但也适合软件工程师、游戏开发业余爱好者,以及游戏产业的从业人员阅读。通过阅读本书,资历较浅的游戏工程师可以巩固他们所学的游戏技术及引擎架构的知识,专注某一领域的程序员也能从本书全面的介绍中获益。《游戏引擎架构》(第2版)不仅可作为知识扫盲的工具,以及延伸学习的跳板,更能让读者扎实地理解游戏引擎中每个工程范畴中的理论与典型实践。本书将助你走过游戏引擎架构那迷人、全方位的难忘之旅。本书讲解商业游戏引擎中各个子系统的理论基础,并论述了实现这些子系统通常所需的数据结构、算法及软件接口。本书聚焦在引擎本身,其中包括底层基础系统、渲染引擎、碰撞系统、物理模拟、角色动画及音频。而在“游戏性基础层”中深入探讨游戏对象模型、世界编辑器、事件系统与脚本系统。书中还涉及一些游戏编程方面的技术,如玩家机制、摄像头和人工智能。《游戏引擎架构》广受欢迎,成为游戏引擎软件开发理论和实践的完整指南。第2版按当今游戏引擎架构发展趋势更新大量内容,进一步完善对典型游戏引擎各主要模块的讲解,重点新内容包括:·更新了各个主题的信息,包括C++编程语言的最新版本C++11、第8代游戏机Xbox One 和PlayStation 4。·新增了音频技术章节,包含AAA游戏音频引擎所涉及的物理、数学和技术等方面的知识。·更新了多核编程、流水线CPU架构、优化、国际化、赝矢量、格拉斯曼代数、对偶四元数、SIMD矢量数学、内存对齐及抗锯齿等章节。

前言

推荐序 1 最初拿到 Game Engine Architecture 一书的英文版 , 是电子工业出版社博文视点公司的编辑侠少邮寄给我的打印版。他建议我接下翻译此书的重任。当时我正在杭州带领一个团队开发 3D 游戏引擎 , 我和我的同事都对这本书的内容颇有兴趣 , 两大本打印的英文书稿立刻在同事间传开。可惜那段时间个人精力实在有限 , 精读近千页的英文读物后再将其翻译成中文对个人的业余时间来说是一个极大的挑战 , 不能担此翻译任务颇为遗憾。 不久以后听说 Milo Yip ( 叶劲峰 ) 已开始着手翻译 , 甚为欣喜。翻译此巨著 , 他一定是比我更合适的人选。我和 Milo 虽未曾谋面 , 但神交已久 , 在网络上读过一些他的成长经历 , 和我颇为相似 , 心有戚戚。他对游戏 3D 实时渲染技术研究精深为我所不及 , 我们曾通过 Google Talk 讨论过许多技术问题 , 他都有独到的见解。 Milo 是香港人 , 英文技术术语在香港的中文译法和内地有许多不同 , 但此书由内地出版社出版 , 考虑到面对的读者主要是内地程序员 , Milo 希望能更符合内地程序员的用词习惯 , 所以在翻译开始时就通过 Google Docs 创建了协作页面 , 邀请大家共同探讨书中技术术语的中文译法。从中我们可以一窥他作为译者的慎重。 三年之后 , 有幸在出版之前就拿到了完整的译本。这是一本用 LATEX 精心排版的 1000 多页的电子书 , 我只花了一周时间 , 几乎是一口气读完。流畅的阅读享受 , 绝对不仅仅是因为原著精彩的内容 , 精美的版面和翔实的译注也加分不少。 在阅读本书的过程中 , 我不止一次地与作者产生共鸣。例如在第 5 章的内存管理系统的介绍中 , 作者介绍的几种游戏特有的内存管理方法我都曾在项目中用过 , 而这是第一次有书籍专门将这些方法详尽地记录下来 ; 又如第 11 章动画系统的介绍 , 我同样也有在 3D 引擎开发过程中改进原有动画片段混合方法的经历。虽然书中介绍的每个技术点都可能在某篇论文、某本书的某个章节、某篇网络博客上见过 , 但之前却无一本书可以把这些内容放在一起相互参 照。对于从事游戏引擎开发的程序员来说 , 了解各种引擎在处理每个具体问题时的方案是相当重要的。而每种方案又各有利弊 , 即使不做引擎开发工作而是在某一特定游戏引擎上做游戏开发 , 也可以从中理解引擎的局限性以及可能的改进方法。尤其是第 14 章介绍的对游戏性相关系统的设计 , 每个开发人员几乎都是凭经验设计 , 很少有书籍对这些知识点进行总结。对于基于渲染引擎做开发的游戏程序员 , 这是必须面对的工作 , 这一章有很大的借鉴意义。 本书作者是业内资深的游戏引擎开发者 , 他所参与研发的《神秘海域》和《最后生还者》游戏都是我个人的最爱。在玩游戏的过程中 , 出于游戏程序员的天性 , 自然会不断地猜想各个技术点是如何实现的 , 背后需要怎样的工具支持。这些能在书中一一得到印证是一件让人特别开心的事情。另外 , 作者反复强调代码实践的重要性 , 在书中遍布着 C++ 代码。我不认为这些代码有直接取来使用的价值 , 但它们极大地帮助了读者理解书中的技术点。书中列出的顽皮狗工作室用 lisp 方言编写游戏配置脚本的范例也给了我很大的启发 , 有了这些具体的代码示例以及作者本身一线工程师的背景 , 让我确信书中那些与主机游戏开发相关等我所没有接触过的内容都绝非泛泛之谈。 国内游戏开发社区的壮大 , 主要随最近十年的 MMO 风潮而生。而就在大型网络游戏于国内有些偏离电子游戏的游戏性趋势时 , 我们有幸迎来了为移动设备开发游戏的大潮。游戏开发的重心重新回到游戏性本身。我们更需要借鉴单机游戏是如何为玩家带来更纯粹的游戏体验的 , 我相信书中记录的各种技术点会变得对广大读者更有帮助。 云风 (@ 简悦云风 ) 推荐序 2 在我认识的许多游戏业开发同仁中 , 只有少数香港同胞 , Milo Yip ( 叶劲峰 ) 却正是这样一位让我印象非常深刻的、优秀的香港游戏开发者。我俩认识是在 Milo 加入腾讯互动娱乐研发部引擎技术中心后 , 至今也只是两年多的时间。其间 , 他谦逊务实的为人 , 对待技术问题的严谨求真态度 , 对算法设计和性能优化的娴熟技术 , 都为人所称道。 Milo 一丝不苟的工作风格 , 甚至表现在对待技术文档排版这类事情上 (Milo 常执着地用 LATEX 将技术文档排版到完美 ), 我想这一定是他在香港读大学、硕士及在香港理工大学的多媒体创新中心从事研究员 , 一贯沿袭至今的好作风。 我很高兴腾讯游戏有实力吸引到这样优秀的技术专家 , 即使 Milo 已从上海迁回香港家中 ,依然选择到深圳腾讯互动娱乐总部工作。从此 , Milo 工作日每天早晚过关 , 来往香港和深圳两地 , 虽有舟车劳顿 , 但是兼顾了对家庭的照顾和在游戏引擎方面的专业研究 , 希望这样的状况是令他满意的。 认识 Milo 时 , 我便知道他在进行 Jason Gregory 所著的 Game Engine Architecture 一书的翻译工作。因为自己从前也有业余翻译游戏开发相关书籍的经历 , 所以我能理解其中的辛苦和责任重大 , 对 Milo 也更多了一分钦佩。我以为 , 本书以及本书的中文读者最大的幸运便是 , 遇到 Milo 这位对游戏有着如同对家对国般强烈责任感 , 犹如“游戏科学工作者”般的专业译者 ! 现在 (2013 年年末 ) 无疑是游戏史上对独立游戏制作者最友好的年代 , 开发设备方便获得 ( 相对过去仅由主机厂商授权才能获得专利开发设备 , 现在有一台智能手机和一台个人电脑就可以开发游戏 ) 、技术工具友好、调试过程简单方便 , 且互联网上有丰富的教程和开源代码可供参考 , 还有网上社区便于交流。很多游戏爱好者能够很快地制作出可运行的游戏原型 , 其中一些还能发布到应用商店。 但是不全面掌握各方面知识 , 尤其是游戏引擎架构知识 , 往往只能停留在勉强修改、凑合重用别人提供的资源的应用程度上 , 难以做到极限的性能改进 , 更妄谈革命式的架构创新。这样的程度是很难从成千上万的游戏中脱颖而出的。我们所认可的真正的游戏大作必定是在某方面大幅超越用户期待的产品。为了打造这样的产品 , 游戏内容创作者 ( 策划、美工等 ) 需要“戴着镣铐跳舞” ( 在当前的条件下争取更多的创作自由度 ), 而引擎架构合理的游戏可以经得 起 —— 也值得进行 —— 反复优化 , 最终可以提供更多的自由度 , 这是大作出现的技术前提。 书的作者、译者、出版社的编辑 , 加上读者 , 大家是因书而结缘的有缘人。因 Milo 这本《游戏引擎架构》译著而在线上线下相识的读者们 , 你们是不是因“了解游戏引擎架构 , 从而制作 / 优化好游戏”这样的理想而结了缘呢 ? 亲爱的读者 , 愿你的游戏作品有一天因谜题巧妙绝伦、趣味超凡、虚拟世界气势磅礴、视觉效果逼真精美等专业因素取得业界褒奖 , 并得到玩家真诚的赞美。希望届时曾读过 Milo 这本《游戏引擎架构》译著的你 , 也可以回馈社会 , 回馈游戏开发的学习社区 , 帮助新人。希望你也可以建立微信公众号、博客等 , 或翻译游戏开发书籍 , 造福外语不好的读者 , 所以如果你的外语 ( 英语、日语、韩语对于游戏行业来说比较重要 ) 水平仍须精进 , 现在也可以同步加油了 ! 沙鹰 (yingsha@qq.com) 第 1 版前言 欢迎来到《游戏引擎架构》的世界。本书旨在全面探讨典型商业游戏引擎的主要组件。游戏编程是一个庞大的主题 , 有许多内容需要讨论。不过相信你会发现 , 我们讨论的深度将足以使你充分理解本书所涵盖的工程理论及常用实践的方方面面。话虽如此 , 令人着迷的漫长游戏编程之旅其实才刚刚启程。与此相关的每项技术都包含丰富内容 , 本书将为你打下基础 , 并引领你进入更广阔的学习空间。 本书的焦点在于游戏引擎的技术及架构。我们会探讨商业游戏引擎中各个子系统的相关理论 , 以及实现这些理论所需要的典型数据结构、算法和软件接口。游戏引擎与游戏的界限颇为模糊。我们将把注意力集中在引擎本身 , 包括多个低阶基础系统 (low-level foundation sys-tem) 、渲染引擎 (rendering engine) 、碰撞系统 (collision system) 、物理模拟 (physics simulation) 、人物动画 (character animation), 以及一个我称之为游戏性基础层 (gameplay foundation layer)的深入讨论。此层包括游戏对象模型 (game object model) 、世界编辑器 (world editor) 、事件系统 (event system) 及脚本系统 (scripting system) 。我们也将会接触游戏性编程 (gameplay programming) 的多个方面 , 包括玩家机制 (player mechanics) 、摄像机 (camera) 及人工智能 (artificial intelligence, AI) 。然而 , 这类讨论会被限制在游戏性系统和引擎接口范围内。 本书可以作为大学中级游戏程序设计中两到三门课程的教材。当然 , 本书也适合软件工程师、业余爱好者 , 以及游戏行业的从业人员阅读。通过阅读本书 , 资历较浅的游戏程序员可以巩固他们所学的游戏数学、引擎架构及游戏科技方面的知识 , 专注某一领域的资深程序员也能从本书更为全面的介绍中获益。 为了更好地学习本书的内容 , 你需要掌握基本的面向对象编程概念并至少拥有一些 C++编程经验。尽管游戏行业已经开始尝试使用一些新的、令人兴奋的编程语言 , 然而工业级的 3D 游戏引擎仍然是用 C 或 C++ 编写的 , 任何对自己有较高要求的游戏程序员都应该掌握 C++ 。 我们将在第 3 章重温一些面向对象编程的基本原则 , 毫无疑问 , 你也会从本书学到一些 C++第 1 版的小技巧 , 不过 C++ 的基础最好还是通过阅读参考文献 [41] 、 [31] 及 [32] 来获得。如果你对 C++ 已经有点生疏 , 建议你在阅读本书的同时最好能重温这几本书籍或者类似书籍。如果你完全没有 C++ 经验 , 在看本书之前 , 可以考虑先阅读参考文献 [41] 的前几章 , 或者尝试学习一些 C++ 的在线教程。 学习编程技能最好的方法就是写代码。在阅读本书时 , 强烈建议你选择一些特别感兴趣的主题付诸实践。举例来说 , 如果你觉得人物动画很有趣 , 那么可以首先安装 OGRE, 并测试一下它的蒙皮动画示范。接着还可以尝试用 OGRE 实现本书谈及的一些动画混合技巧。下一步你可能会打算用游戏手柄控制人物在平面上行走。等你能玩转一些简单的东西了 , 就应该以此为基础 , 继续前进 ! 之后可以转移到另一个游戏技术范畴 , 循序渐进。这些项目是什么并不重要 , 重要的是你在实践游戏编程的艺术 , 而不是纸上谈兵。 游戏科技是一个活生生、会呼吸的家伙 , 你永远不可能将之束缚于书本之上。因此 , 附加的资源、勘误、更新、示例代码、项目构思等已经发到本书的网站。 第 1 版序言 最早的电子游戏完全由硬件构成 , 但微处理器 (microprocessor) 的高速发展完全改变了游戏的面貌。现在的游戏是在多用途的 PC 或专门的电子游戏主机 (video game console) 上玩的 ,凭借软件带来绝妙的游戏体验。从最初的游戏诞生至今已有半个世纪 , 但很多人仍然认为游戏是一个未成熟的产业。即使游戏可能是一个年轻的产业 , 若仔细观察 , 会发现它正在高速发展。 现在游戏已成为一个价值上百亿美元的产业 , 覆盖不同年龄、性别的广泛受众。千变万化的游戏 , 可以分为从纸牌游戏到大型多人在线游戏 (massively multiplayer online game, MMOG) 等多个种类 (category) 和类型 (genre) 1 , 也可以运行在任何装有微芯片 (microchip) 的设备上。你现在可以在 PC 、手机及多种特别为游戏而设计的手持 / 电视游戏主机上玩游戏。家用电视游戏通常代表最尖端的游戏科技 , 又由于它们会周期性地推出新版本 , 因此有游戏机“世代” (generation) 的说法。最新一代 2 的游戏机包括微软的 Xbox 360 和索尼的 PlayStation 3, 但一定不可忽视长盛不衰的 PC, 以及最近非常流行的任天堂 Wii 。 最近 , 剧增的下载式休闲游戏 , 使这个多样化的商业游戏世界变得更复杂。虽然如此 , 大型游戏仍然是一门大生意。今天的游戏平台非常复杂 , 有让人难以置信的运算能力 , 这使软件的复杂度得以进一步提升。所有这些先进的软件都需要由人创造出来 , 这导致团队人数增加 , 开发成本上涨。随着产业变得成熟 , 开发团队要寻求更好、更高效的方式去制作产品 , 可复用软件 (reusable software) 和中间件 (middleware) 便应运而生 , 以补偿软件复杂度的提升。 由于有这么多风格迥异的游戏及多种游戏平台 , 因此不可能存在单一理想的软件方案。然而 , 业界已经发展出一些模式 , 也有大量的潜在方案可供选择。现今的问题是如何找到一个合适的方案去满足某个项目的需要。再进一步 , 开发团队必须考虑项目的方方面面 , 以及如何把各方面集成。对于一个崭新的游戏设计 , 鲜有可能找到一个完美适配游戏设计各方面的软件包。 如今业界的老手 , 入行时都是“开荒牛”。我们这代人很少是计算机科学专业出身的 (Matt 的专业是航空工程、 Jason 的专业是系统设计工程 ), 但现在很多学院已设有游戏开发的课程和学位。时至今日 , 为了获取有用的游戏开发信息 , 学生和开发者必须找到好的途径。对于高端的图形技术 , 从研究到实践都有大量高质量的信息。可是 , 这些信息经常不能直接应用到游戏的生产环境中 , 或者没有一个生产级质量的实现。对于图形以外的游戏开发技术 , 市面上有一些所谓的入门书籍 , 没提及参考文献就描述很多内容细节 , 像自己发明的一样。这种做法根本没有用处 , 甚至经常带有不准确的内容。另一方面 , 市场上有一些高端的专门领域书籍 , 例如物理、碰撞、人工智能等。可是 , 这类书或者啰唆到让你难以忍受 , 或者高深到让部分读者无法理解 , 又或者内容过于零散而难于融会贯通。有一些甚至会直接和某项技术挂钩 , 软硬件一旦发生变化 , 其内容就会迅速过时。 此外 , 互联网也是收集相关知识的绝佳工具。可是 , 除非你确实知道要找些什么 , 否则链接失效、不准确的资料、质量差的内容也会成为学习的障碍。 好在 , 我们有 Jason Gregory, 他是一位拥有在顽皮狗 (Naughty Dog) 工作经验的业界老手 ,而顽皮狗是全球高度瞩目的游戏工作室之一。 Jason 在南加州大学教授游戏开发课程时 , 找不到概括游戏架构的教科书。值得庆幸的是 , 他承担了这个任务 , 填补了这一空白。 Jason 把可应用到实际发行游戏的生产级别知识 , 以及整个游戏开发的大局编集于本书。他凭经验 , 不仅融汇了游戏开发的概念和技巧 , 还用实际的代码示例及实现例子去说明怎样贯通知识来制作游戏。本书的引用及参考文献可以让读者更深入探索游戏开发过程的各个方面。虽然例子经常是基于某些技术的 , 但是概念和技巧是用来实际创作游戏的 , 它们可以超越个别引擎或 API 的束缚。 本书是一本我们入行做游戏时想要的书。我们认为本书能让入门者增长知识 , 也能为有经验者开拓更大的视野。 第 1 版译者序 数千年以来 , 艺术家们通过文学、绘画、雕塑、建筑、音乐、舞蹈、戏剧等传统艺术形式充实人类的精神层面。自 20 世纪中叶起 , 计算机的普及派生出另一种艺术形式 —— 电子游戏。 游戏结合了上述传统艺术以及近代科技派生的其他艺术 ( 如摄影、电影、动画 ), 并且完全脱离了艺术欣赏这种单向传递的方式 —— 游戏必然是互动的 , “玩家”并不是“读者”、“观众”或“听众”,而是进入游戏世界、感知并对世界做出反应的参与者。 基于游戏的互动本质 , 游戏的制作通常比其他大众艺术复杂。商业游戏的制作通常需要各种人才的参与 , 而制作人员需要依赖各种工具及科技。游戏引擎便是专门为游戏而设计的工具及科技的集成。之所以称为引擎 , 如同交通工具中的引擎 , 提供了最核心的技术部分。因为复杂、研发成本高 , 人们不希望制作每款游戏时都重新设计引擎 , 重用性是游戏引擎的一个重要设计目标。 然而 , 各游戏本身的性质以及平台的差异 , 使研发完全通用的游戏引擎变得极为困难 , 甚至不可能。市面上出售的游戏引擎 , 有一些虽然已经达到很高的技术水平 , 但在商业应用中 , 很多时候还需要因不同的游戏项目对引擎进行改造、整合、扩展及优化。因此 , 即使能使用市面上最好的商用引擎或自研引擎 , 我们仍需要理解其中的架构、机制和技术 , 并且分析及解决在制作中遇到的问题。这些也是译者就职于上海两家工作室时的主要工作范畴。 选择翻译此著作 , 主要原因是在阅读时产生了共鸣 , 并且从中能了解一些知名游戏作品实际中所采用的方案。有感市面上大部分游戏开发书籍并不是由业内人士执笔的 , 内容只够应付一些简单的游戏开发 , 欠缺宏观比较各种方案的内容 , 技术与当今实际情况也有很大的差距。 而一些 Gems 类丛书虽然偶有好文章 , 但受形式所限欠缺系统性、全面性。难得本书原作者身为世界一流游戏工作室的资深游戏开发者 1 , 他在繁重的游戏开发工作之余 , 还在大学教授游戏开发课程以及编写本著作。此外 , 从与内地同事的交流中 , 我了解到许多从业者不愿意阅读外文书籍。为了普及知识及回馈业界 , 译者希望能尽自己的一份绵薄之力。 或许有些人以为本著作是针对单机/游戏机游戏的 , 并不适合国内以网络游戏为主的环境。但译者认为这是一种误解 , 许多游戏本身所涉及的技术是具有通用性的。例如 , 与游戏性相关的游戏性系统、场景管理、人工智能、物理模拟等部分 , 许多时候也会同时用于网络游戏的前台和后台。现在 , 一些以动作为主、非 MMO 的国内端游甚至会直接在后台运行传统意义上的游戏引擎。至于与前台相关的技术 , 单机游戏和端游的区别更小。此外 , 随着近年移动终端的兴起 , 其硬件性能已超越传统掌上游戏机 , 开发手游所需的技术与开发传统掌上游戏机游戏的并无太大差异。还可预料 , 现在单机/游戏机的一些较高级的架构及技术将在不远的将来着陆移动终端平台。 译者认为 , 本书涵盖游戏开发技术的方方面面 , 同时适合入门及经验丰富的游戏程序员阅读。书名中的架构二字 , 并不只是表示给出一个系统结构图 , 还表示描述了每个子系统的需求、相关技术及与其他子系统的关系。对译者本人而言 , 本书的第 11 章 ( 动画系统 ) 及第 15 章 ( 运行时游戏性基础系统 ) 是本书特别精彩之处 , 包含许多少见于其他书籍的内容。而第 10 章 ( 渲染引擎 ) 由于是游戏引擎中的一个极大的部分 , 有限的篇幅可能未能覆盖广度及深度 , 推荐读者阅读参考文献 , 人工智能方面也须参考其他专著。 本译作采用 LATEX 排版 , 以 Inkscape 编译矢量图片。为了令阅读更流畅 , 内文中的网址都统一改为脚注标示。另外 , 由于现在游戏开发相关的文献以英文为主 , 而且游戏开发涉及的知识面很广 , 本译作尽量以括号注释的形式保留英文术语。为了方便读者查找内容 , 在附录中增设中英文双向索引 ( 索引条目与原著中的不同 ) 。 本人在香港成长、学习及工作 , 至 2008 年才赴内地游戏工作室工作 , 不谙内地的中文写作及用词习惯 , 翻译中曾遇到不少困难。有幸得到出版社人员以及良师益友的帮助 , 这才得以完成本译作。特别感谢周筠老师支持本书的提案 , 并耐心地给予协助及鼓励。编辑张春雨老师和卢鸫翔老师 , 以及好友余晟给予了大量翻译方面的帮助及指导。也感谢游戏业界专家云风、大宝和 Dave 给予了许多宝贵意见。此书的翻译及排版工作比预期更花时间 , 感谢妻子及儿女们的体谅。此次翻译工作历时三年半 , 因工作及家庭事宜导致严重延误 , 唯有在翻译及排版工作上更尽心尽力 , 希望得到等待此译作的读者们的谅解。无论是批评或建议 , 诚希读者朋友通过电子邮件、新浪微博、豆瓣等渠道不吝赐教。 叶劲峰 (Milo Yip) 2013 年 10 月 第 2 版前言 我对《游戏引擎架构》 ( 第 2 版 ) 的希望有三方面。首先 , 我希望更新本书 , 以包含最新、最令人兴奋的内容 , 包括 C++ 编程语言的最新版本 C++11, 以及第 8 代游戏机 ——Xbox One和 PlayStation 4 。 第二 , 我希望填补原作内容中的空白。最显著的是 , 我决定添加关于音频的全新章节。此决定部分是因为你 —— 忠实及总是愿意帮忙的读者 —— 的要求。此决定也部分基于 , 以我所知 , 市面上没有讲述开发 AAA 游戏音频引擎的物理、数学及技术的书籍。在任何优秀的游戏中 , 音频都扮演着重要的角色 , 我衷心地希望本书的音频一章对推广游戏音频技术能做出微小的贡献。 第三 , 我希望修正读者反馈的众多错误。谢谢你们 ! 我希望你们能发现 , 你们找到的所有错误都已被修正 , 以及为了本书第 3 版继续反馈给我新出现的错误 ! 当然 , 如我之前所说 , 游戏引擎编程的范畴几乎是无法想象的广和深 , 一本书无法包含所有主题。因此 , 本书的主要目的还是作为一个开阔视野的工具 , 以及进一步学习的跳板。我希望本版能帮助你走过游戏引擎架构那迷人、面向多景观之旅。 第 2 版序言 游戏及计算机是紧紧相连的。从第一款数字电脑游戏的出现 ——1962 年的 Spacewar, 到今天最先进的游戏系统 , 通过计算机的逻辑及数学本质 , 使得游戏中的各个程序方面得以完美结合。数字游戏向我们展示出一个未来世界 , 系统思想、互动及编程基础将带来人类发明、发现及想象的新纪元。这个未来是复杂的 —— 所有人都需要好的指南。 开门见山 : 本人认为 , 本书是同类书籍中最好的 , 你找到它是一种幸运。本书以简明、清楚的方式覆盖游戏引擎架构这个庞大领域 , 并巧妙地平衡了此领域的广度与深度 , 它提供了足够的细节 , 即使初学者也能很容易地理解其中的各种概念。而作者 Jason Gregory 不单是该领域的世界级专家 , 他还是一位在职程序员 , 富有成品品质的知识 , 并参与过许多已发行的游戏项目。他与顽皮狗的游戏工程师一起工作 , 顽皮狗是世界一流的游戏制作工作室之一 , 制作了多款被广泛认为是史上最佳的游戏。除此以外 , 他还是有着丰富经验的教育家 , 曾在北美排名靠前的大学教授游戏开发课程。 为什么你应该相信我 , 因为你正在看的是一颗罕有的“宝石” , 这本书将会成为你的游戏开发参考藏书的重要成员。以下我将尽力加强你对我这一主张的信心。 成年以后 , 我一直以专业游戏设计师为业。其中大部分时间 , 我在顽皮狗以首席游戏设计师身份工作 , 而顽皮狗是索尼旗下的工作室 —— 对 , 就是那个创造了 Crash Bandicoot 及 Jak and Daxter 系统游戏的那个工作室。首次认识 Jason Gregory 是在顽皮狗 , 现在我认识他已很长时间了 , 在顽皮狗 , 他与我荣幸地参与了全部三集叫好又叫座的《神秘海域》 (Uncharted) 系列游戏。 Jason 还继续参与了顽皮狗的下一个极其成功的讲故事动作游戏《最后生还者》 (The Last of Us) 。 我的游戏设计师生涯始于英国的 MicroProse 公司 , 在加入顽皮狗之前 , 我在 Crystal Dynamics 工作 , 参与制作了 Gex 和 Legacy of Kain: Soul Reaver 等游戏系列。在顽皮狗工作的 8个奇妙年头中 , 我学到了非常多的东西 , 现在成了南加州大学戏剧艺术学院互动媒体及游戏部门的老师。我教授南加州大学的游戏课程 , 并在该校的游戏创新实验室设计游戏。南加州大学与顽皮狗工作室有着紧密的联系 , Jason 也在南加州大学的 Viterbi 工程学院教授游戏课程中的编程课。 当我初识 Jason 时 , 他刚从我们附近的艺电转到顽皮狗来 , 他任职于艺电时有许多非常优秀的工作成果 , 包括高技术水平及艺术驱动的游戏动画方面的工作成果。我们两人几乎能即时合拍工作。他承担了许多复杂的任务 , 其中之一是协助开发脚本语言及其专门的编辑环境 , 这让我的游戏设计师前辈与我能把各种美术资源、动画、音频、视觉特效及代码连接在一起 , 成为可以震撼《神秘海域》玩家的章节。所以我有第一手经验 , 知道 Jason 如何把复杂的概念变得清晰。他有一套参与开发的工具 , 是我平生用过的最好的工具 ; 而且 , 通过与他一起工作 , 我知道他把同样强大的技术与清晰的沟通能力带进了专业生涯中的每一款游戏系统里 , 以及本著作。 当代的视频游戏开发是一门大学科。从设计到开发 , 从 AAA到独立游戏 , 从渲染、碰撞到工具编程 , 要做一个游戏 , 需要很多交叉的系统及技巧。说起我们现有的游戏制作工具 , 其功能与复杂度是不匹配的 , 本书中的许多详细代码示例及实现示例能帮助读者读取并理解这些碎片是如何拼凑成一个好游戏的。通过这种方式帮助读者 , Jason 的书也许能令你超越史上最好的游戏设计师及实现开发者做过的最大胆的梦。 本书提供了一个概览 , 但它不仅停留在知识表面 , 还挖掘至足够深度 , 令我们有机会理解每个所提及的题目。我的好友 Ian Dallas (Giant Sparrow 的创意总监、 The Unfinished Swan 的创作者 ) 曾手按本书 , 以他带有丰富感情色彩的语言发誓 : 这本书给了我们一个机会去“吃大象的一块” —— 用这包含巨大学问的“大局观”作为开始 , 不然我们难以踏出第一步去理解这么广阔的题目。 现在也是接触游戏软件工程的好时机。全世界都有学校提供高质量的课程 , 由经验丰富的游戏创作者教授各种技术及艺术方面的技能。游戏也正在进入难以想象的复兴时期 , 受独立游戏及艺术游戏的一些影响 , 它为我们的世界带来了新声音及新角度 , 这些都同时加强了主流计算机、游戏机及移动端游戏非常健康及创新的发展。 让我们迎着众多扣人心弦、未知的数字游戏未来而行 , 此领域对娱乐、艺术及商业来说 ,只会变得越来越有趣 , 对文化越来越有影响力 , 也越来越具创新性。没有比这本书更好的跳板 ,或是比 Jason Gregory 更好、更明智的向导 , 让它和他引领我们开始这个迷人的游戏开发世界终身学习之旅吧 ! Richard Lemarchand 第 2 版译者序 不知不觉 , 《游戏引擎架构》 ( 第 1 版 ) 已出版十年。十年前 , iPhone 3GS 面世 , 《愤怒的小鸟》在同年上架 AppStore 。随着智能手机的渗透率不断增长 , 全球范围内移动端游戏极速超越 PC 和游戏机 , 成为用户最多及收入最高的游戏平台。我开始翻译本书时 , 正任职于麻辣马开发 PC/ 游戏机平台游戏 , 之后幸运地在 2011 年加入腾讯 , 从事游戏引擎技术的研发工作 , 因此亲历了这个浪潮。 2013 年 , 国内《天天爱消除》和《天天酷跑》这两款 2D 手游成为行业爆款 , 而我在当年第 1 版译序中写下“还可预料 , 现时单机 / 游戏机的一些较高级的架构及技术 , 将在不远的未来着陆移动终端平台。”那时候 , 不少人认为手机只适合这些休闲游戏 , 也许不需要前沿技术。 然而 , 随后各种游戏类型陆续出现 , MOBA 的王者属《王者荣耀》 , ACT 有《火影忍者》 , FPS 有《穿越火线》以至本年的《和平精英》。我回看这十多年的游戏硬件发展 , 虽然移动平台的性能和顶级游戏机有稳定十年的差距 , 但在架构和技术上 , 移动平台的游戏已逐渐贴近前沿。 在端游时代 , 游戏项目的技术选型多姿多彩 , 有选择自研游戏引擎的 ( 如《天涯明月刀》的 QuickSilver 引擎 ) , 也有选择各种商业和开源游戏引擎的。但在 2013—2017 年间 , 除了网易继续自研引擎 , 国内大部分手游项目都选择了 Unity 。 Unity 引擎具有非常友好的工具及编程环境 , 它采用 C# 语言也减轻了开发者的负担 , 令游戏团队能非常高效地进行生产。但与此同时 , 它的黑盒性质也极大地影响了这一代游戏程序员。这种情况在我做公司内部晋级评审时深有感受 : 以往一些工作可能需要深入了解技术原理 , 并寻找适合项目的最优方案 , 然后把技术从无到有地实现出来 , 在这个过程中对开发人员的技术成长很有帮助 ; 而面对黑盒 , 很多时候是通过猜想个中的实现 , 再尝试以打补丁的方式去解决问题 , 很少有机会完整地实现一些技术 , 使开发人员更易缺失对底层的开发能力。但当手游竞争越趋激烈时 , 游戏开发周期从 3 个月上升至 3 年 , 开发团队的技术能力也变得越来越重要。 2015 年 , Unreal 提供源代码给所有人 , 并且大力增强对移动平台的支持 , 开始成为手游项目的另一可行选项。如果仅考虑对开发人员的成长 , 我会建议尽量使用具源代码的工具 , 并多了解它的内部是如何运作的 , 在适当时候做出修改。期待我们能继续提升技术水平 , 并发挥创新能力 , 进一步提升游戏的品质。 在《游戏引擎架构》 ( 第 1 版 ) 出版以来 , 我收到大量读者反馈 , 一些错漏之处也在每次印刷中进行修正。不时有朋友告诉我 , 他们因为读这本译作而对游戏引擎技术产生兴趣 , 最后还加入了这个行业 , 身为译者的我深感欣慰。 2014 年 , 我在美国三藩市游戏开发大会遇到原作者 Jason Gregory, 是令人十分兴奋的时刻。但对于一直期待第 2 版的朋友 , 面对以年为单位的等待 , 本人实在难辞其咎。虽然百辞莫辩 , 也必须做出一些交代。除了繁忙的工作 , 在数年里我花了不少工余时间在知乎上回答问题及写技术文章 , 学习并实践多方面的兴趣 , 也在近不惑之年才开始注重身体健康而去系统锻炼。由于个人的能力及时间有限 , 我也希望能和其他人合作去推动知识分享 , 例如刚出版的《腾讯游戏开发精粹》便是我通过腾讯游戏学院发起的项目 ,而另一本和同事合译的作品《基于物理的建模与动画》也即将与大家见面。 由于有些读者已读过第 1 版 , 所以我特意在新增的章节标题中加入剑标符 ?, 以方便挑选阅读。最后 , 期望这本书能引发你对游戏技术的兴趣 , 在未来可以玩到你的游戏作品。 叶劲峰 (Milo Yip) 2019 年 9 月

目录

第 2 版序言 .........................................xxxiii 第 1 版序言 .........................................xxxv 第 2 版前言 .........................................xxxvii 第 1 版前言 .........................................xxxviii 致谢 .............................................xl 第 I 部分 基 础 第 1 章 导论 .......................................3 1.1 典型游戏团队的结构 ................................4 1.1.1 工程师 .....................................5 1.1.2 艺术家 .....................................5 1.1.3 游戏设计师 ...................................6 1.1.4 制作人 .....................................7 1.1.5 其他工作人员 ..................................7 1.1.6 发行商及工作室 .................................7 1.2 游戏是什么 .....................................8 1.2.1 电子游戏作为软实时模拟.............................8 1.3 游戏引擎是什么 ...................................10 1.4 不同游戏类型的引擎差异 ..............................11 1.4.1 第一人称射击游戏 ................................12 1.4.2 平台及其他第三人称游戏.............................13 1.4.3 格斗游戏 ....................................15 1.4.4 竞速游戏 ....................................17 1.4.5 实时策略游戏 ..................................18 1.4.6 大型多人在线游戏 ................................20 1.4.7 玩家创作内容 ? ..................................21 1.4.8 其他游戏类型 ..................................23 1.5 游戏引擎概览 ....................................24 1.5.1 雷神之锤引擎家族 ................................24 1.5.2 虚幻引擎 ....................................25 1.5.3 Source 引擎 ...................................26 1.5.4 DICE 的寒霜引擎 ? ...............................26 1.5.5 CryEngine ? ...................................26 1.5.6 索尼的 PhyreEngine ? ..............................27 1.5.7 微软的 XNA Game Studio............................27 1.5.8 Unity ? .....................................27 1.5.9 供非程序员使用的二维游戏引擎 ? .........................28 1.5.10 其他商业引擎 .................................29 1.5.11 专有内部引擎 .................................29 1.5.12 开源引擎....................................29 1.6 运行时引擎架构 ...................................30 1.6.1 目标硬件 ....................................32 1.6.2 设备驱动程序 ..................................32 1.6.3 操作系统 ....................................32 1.6.4 第三方软件开发包和中间件............................33 1.6.5 平台独立层 ...................................36 1.6.6 核心系统 ....................................36 1.6.7 资源管理器 ...................................37 1.6.8 渲染引擎 ....................................37 1.6.9 剖析和调试工具 .................................41 1.6.10 碰撞和物理...................................42 1.6.11 动画 ......................................43 1.6.12 人体学接口设备 ................................44 1.6.13 音频 ......................................45 1.6.14 在线多人/网络游戏 ...............................46 1.6.15 游戏性基础系统 ................................47 1.6.16 个别游戏专用子系统 ..............................50 1.7 工具及资产管道 ...................................50 1.7.1 数字内容创作工具 ................................50 1.7.2 资产调节管道 ..................................52 1.7.3 世界编辑器 ...................................54 1.7.4 资源数据库 ? ...................................55 1.7.5 一些构建工具的方法 ...............................55 第 2 章 专业工具 ....................................58 2.1 版本控制 .......................................58 2.1.1 为何使用版本控制 ................................58 2.1.2 常见的版本控制系统 ...............................59 2.1.3 Subversion 和 TortoiseSVN 概览 .........................60 2.1.4 在 Google 上设置代码版本库...........................61 2.1.5 安装 TortoiseSVN ................................61 2.1.6 文件版本、更新和提交 ..............................63 2.1.7 多人签出、分支及合并 ..............................64 2.1.8 删除 ......................................66 2.2 微软 Visual Studio..................................66 2.2.1 源文件、头文件及翻译单元 ............................67 2.2.2 程序库、可执行文件及动态链接库.........................67 2.2.3 项目及解决方案 .................................68 2.2.4 生成配置 ....................................69 2.2.5 调试代码 ....................................75 2.3 剖析工具 .......................................81 2.3.1 剖析器列表 ...................................83 2.4 内存泄漏和损坏检测 ................................83 2.5 其他工具 .......................................84 第 3 章 游戏软件工程基础 ..............................85 3.1 重温 C++ 及最佳实践 ...............................85 3.1.1 扼要重温面向对象编程..............................85 3.1.2 编码标准: 为什么及需要多少 ...........................91 3.1.3 C++11 ? ....................................92 3.2 C/C++ 的数据、代码及内存 ............................99 3.2.1 数值表达形式 ..................................99 3.2.2 声明、定义及链接规范 ..............................109 3.2.3 C/C++ 内存布局 ................................115 3.2.4 成员变量 ....................................119 3.2.5 对象的内存布局 .................................121 3.2.6 kilobyte 及 kibibyte ...............................129 3.3 捕捉及处理错误 ...................................129 3.3.1 错误类型 ....................................129 3.3.2 错误处理 ....................................130 3.3.3 实现错误检测及处理 ...............................132 3.4 流水线、缓存及优化 .................................136 3.4.1 并行范式转移 ..................................136 3.4.2 内存缓存 ....................................137 3.4.3 指令流水线及超纯量 CPU ............................142 第 4 章 游戏所需的三维数学 .............................146 4.1 在二维中解决三维问题 ...............................146 4.2 点和矢量 .......................................146 4.2.1 点和笛卡儿坐标 .................................147 4.2.2 左手坐标系与右手坐标系的比较 .........................148 4.2.3 矢量 ......................................149 4.2.4 矢量运算 ....................................150 4.2.5 点和矢量的线性插值 ...............................160 4.3 矩阵 .........................................160 4.3.1 矩阵乘法 ....................................161 4.3.2 以矩阵表示点和矢量 ...............................162 4.3.3 单位矩阵 ....................................163 4.3.4 逆矩阵 .....................................163 4.3.5 转置矩阵 ....................................163 4.3.6 齐次坐标 ....................................164 4.3.7 基础变换矩阵 ..................................165 4.3.8 4 × 3 矩阵 ...................................168 4.3.9 坐标空间 ....................................168 4.3.10 基的变更....................................171 4.3.11 变换法矢量...................................175 4.3.12 在内存中存储矩阵 ...............................175 4.4 四元数 ........................................177 4.4.1 把单位四元数视为三维旋转............................178 4.4.2 四元数运算 ...................................178 4.4.3 以四元数旋转矢量 ................................180 4.4.4 等价的四元数和矩阵 ...............................181 4.4.5 旋转性的线性插值 ................................183 4.5 比较各种旋转表达方式 ...............................185 4.5.1 欧拉角 .....................................185 4.5.2 3 × 3 矩阵 ...................................186 4.5.3 轴角 ......................................186 4.5.4 四元数 .....................................187 4.5.5 SQT 变换....................................187 4.5.6 对偶四元数 ...................................188 4.5.7 旋转和自由度 ..................................188 4.6 其他数学对象 ....................................189 4.6.1 直线、光线及线段 ................................189 4.6.2 球体 ......................................190 4.6.3 平面 ......................................190 4.6.4 轴对齐包围盒 ..................................192 4.6.5 定向包围盒 ...................................193 4.6.6 平截头体 ....................................193 4.6.7 凸多面体区域 ..................................194 4.7 硬件加速的 SIMD 运算 ...............................194 4.7.1 SSE 寄存器 ...................................195 4.7.2 __m128 数据类型 ................................196 4.7.3 用 SSE 内部函数编码 ..............................197 4.7.4 用 SSE 实现矢量与矩阵的相乘 ..........................199 4.8 产生随机数 .....................................203 4.8.1 线性同余产生器 .................................204 4.8.2 梅森旋转 ....................................204 4.8.3 所有伪随机数产生器之母及 Xorshift .......................205 第 II 部分 底层引擎系统 第 5 章 游戏支持系统 .................................209 5.1 子系统的启动和终止 ................................209 5.1.1 C++ 的静态初始化次序 (是不可用的) ......................209 5.1.2 行之有效的简单方法 ...............................212 5.1.3 一些实际引擎的例子 ...............................214 5.2 内存管理 .......................................218 5.2.1 优化动态内存分配 ................................218 5.2.2 内存碎片 ....................................227 5.3 容器 .........................................231 5.3.1 容器操作 ....................................232 5.3.2 迭代器 .....................................233 5.3.3 算法复杂度 ...................................234 5.3.4 建立自定义的容器类 ...............................236 5.4 字符串 ........................................248 5.4.1 字符串的使用问题 ................................248 5.4.2 字符串类 ....................................249 5.4.3 唯一标识符 ...................................249 5.4.4 本地化 .....................................253 5.5 引擎配置 .......................................263 5.5.1 读/写选项....................................263 5.5.2 个别用户选项 ..................................264 5.5.3 真实引擎中的配置管理..............................265 第 6 章 资源及文件系统 ................................270 6.1 文件系统 .......................................270 6.1.1 文件名和路径 ..................................271 6.1.2 基本文件 I/O ..................................274 6.1.3 异步文件 I/O ..................................277 6.2 资源管理器 .....................................281 6.2.1 离线资源管理及工具链..............................281 6.2.2 运行时资源管理 .................................289 第 7 章 游戏循环及实时模拟 .............................305 7.1 渲染循环 .......................................305 7.2 游戏循环 .......................................306 7.2.1 简单例子: 《乓》 .................................306 7.3 游戏循环的架构风格 ................................308 7.3.1 视窗消息泵 ...................................308 7.3.2 回调驱动框架 ..................................309 7.3.3 基于事件的更新 .................................311 7.4 抽象时间线 .....................................311 7.4.1 真实时间 ....................................311 7.4.2 游戏时间 ....................................311 7.4.3 局部及全局时间线 ................................312 7.5 测量及处理时间 ...................................313 7.5.1 帧率及时间增量 .................................313 7.5.2 从帧率到速率 ..................................314 7.5.3 使用高分辨率计时器测量实时时间 ........................317 7.5.4 时间单位和时钟变量 ...............................318 7.5.5 应对断点 ....................................321 7.5.6 一个简单的时钟类 ................................322 7.6 多处理器的游戏循环 ................................325 7.6.1 多处理器游戏机的架构..............................326 7.6.2 SIMD......................................331 7.6.3 分叉及汇合 ...................................331 7.6.4 每个子系统运行于独立线程............................333 7.6.5 作业模型 ....................................334 7.6.6 异步程序设计 ..................................334 7.7 网络多人游戏循环 ..................................337 7.7.1 主从式模型 ...................................337 7.7.2 点对点模型 ...................................339 7.7.3 案例分析: 《雷神之锤 II》.............................339 第 8 章 人体学接口设备 ................................342 8.1 各种人体学接口设备 ................................342 8.2 人体学接口设备的接口技术 .............................344 8.2.1 轮询 ......................................344 8.2.2 中断 ......................................344 8.2.3 无线设备 ....................................345 8.3 输入类型 .......................................345 8.3.1 数字式按钮 ...................................345 8.3.2 模拟式轴及按钮 .................................347 8.3.3 相对性轴 ....................................348 8.3.4 加速计 .....................................348 8.3.5 以 Wii 遥控器或 DualShock 做三维定向 .....................349 8.3.6 摄像机 .....................................350 8.4 输出类型 .......................................352 8.4.1 震动反馈 ....................................352 8.4.2 力反馈 .....................................353 8.4.3 音频 ......................................353 8.4.4 其他输入/输出 .................................353 8.5 游戏引擎的人体学接口设备系统 ..........................353 8.5.1 典型需求 ....................................354 8.5.2 死区 ......................................354 8.5.3 模拟信号过滤 ..................................355 8.5.4 输入事件检测 ..................................357 8.5.5 为多位玩家管理多个 HID ............................364 8.5.6 跨平台的 HID 系统 ...............................364 8.5.7 输入的重新映射 .................................366 8.5.8 上下文相关控制 .................................367 8.5.9 禁用输入 ....................................368 8.6 人体学接口设备使用实践 ..............................368 第 9 章 调试及开发工具 ................................370 9.1 日志及跟踪 .....................................370 9.1.1 使用 OutputDebugString() 做格式化输出.....................371 9.1.2 冗长级别 ....................................372 9.1.3 频道 ......................................373 9.1.4 把输出同时抄写至日志文件............................374 9.1.5 崩溃报告 ....................................374 9.2 调试用的绘图功能 ..................................375 9.2.1 调试绘图 API ..................................378 9.3 游戏内置菜单 ....................................382 9.4 游戏内置主控台 ...................................385 9.5 调试用摄像机和游戏暂停 ..............................386 9.6 作弊 .........................................386 9.7 屏幕截图及录像 ...................................387 9.8 游戏内置性能剖析 ..................................387 9.8.1 层阶式剖析 ...................................389 9.8.2 导出至 Excel ..................................394 9.9 游戏内置的内存统计和泄漏检测 ..........................394 第 III 部分 图形、运动与声音 第 10 章 渲染引擎 ...................................401 10.1 采用深度缓冲的三角形光栅化基础 ........................401 10.1.1 场景描述....................................403 10.1.2 描述表面的视觉性质 ..............................410 10.1.3 光照基础....................................423 10.1.4 虚拟摄像机...................................432 10.2 渲染管道 ......................................442 10.2.1 渲染管道概览 .................................443 10.2.2 工具阶段....................................444 10.2.3 资产调节阶段 .................................446 10.2.4 GPU 简史 ...................................447 10.2.5 GPU 管道 ...................................448 10.2.6 可编程着色器 .................................452 10.2.7 抗锯齿 ? ....................................456 10.2.8 应用程序阶段 .................................459 10.3 高级光照及全局光照 ................................468 10.3.1 基于图像的光照 ................................468 10.3.2 高动态范围光照 ................................472 10.3.3 全局光照....................................473 10.3.4 延迟渲染....................................479 10.3.5 基于物理着色 ? .................................480 10.4 视觉效果和覆盖层 .................................481 10.4.1 粒子效果....................................481 10.4.2 贴花 ......................................482 10.4.3 环境效果....................................483 10.4.4 覆盖层.....................................486 10.4.5 伽马校正....................................487 10.4.6 全屏后期处理效果 ...............................488 10.5 延伸阅读 ......................................489 第 11 章 动画系统 ...................................490 11.1 角色动画的类型 ..................................490 11.1.1 赛璐璐动画...................................490 11.1.2 刚性层阶式动画 ................................491 11.1.3 每顶点动画及变形目标 .............................492 11.1.4 蒙皮动画....................................493 11.1.5 把动画方法视为数据压缩技术 ..........................494 11.2 骨骼 .........................................495 11.2.1 骨骼层阶结构 .................................496 11.2.2 在内存中表示骨骼 ...............................497 11.3 姿势 .........................................498 11.3.1 绑定姿势....................................498 11.3.2 局部姿势....................................499 11.3.3 全局姿势....................................501 11.4 动画片段 ......................................502 11.4.1 局部时间线...................................503 11.4.2 全局时间线...................................506 11.4.3 比较局部和全局时钟 ..............................508 11.4.4 简单的动画数据格式 ..............................511 11.4.5 连续的通道函数 ................................512 11.4.6 元通道.....................................513 11.5 蒙皮及生成矩阵调色板 ...............................514 11.5.1 每顶点的蒙皮信息 ...............................515 11.5.2 蒙皮涉及的数学知识 ..............................515 11.6 动画混合 ......................................519 11.6.1 线性插值混合 .................................519 11.6.2 线性插值混合的应用 ..............................521 11.6.3 复杂的线性插值混合 ..............................526 11.6.4 骨骼分部混合 .................................529 11.6.5 加法混合....................................531 11.6.6 加法混合的应用 ................................533 11.7 后期处理 ......................................536 11.7.1 程序式动画...................................536 11.7.2 逆运动学....................................537 11.7.3 布娃娃.....................................538 11.8 压缩技术 ......................................538 11.8.1 通道省略....................................539 11.8.2 量化 ......................................539 11.8.3 采样频率及键省略 ...............................543 11.8.4 基于曲线的压缩 ................................543 11.8.5 选择性载入及串流 ...............................544 11.9 动画系统架构 ....................................544 11.10 动画管道 .....................................545 11.10.1 数据结构 ...................................546 11.10.2 扁平的加权平均混合表示法 ..........................549 11.10.3 混合树 ....................................552 11.10.4 淡入/淡出架构 ................................555 11.10.5 动画管道的优化 ................................557 11.11 动作状态机 ....................................559 11.11.1 动画状态 ...................................559 11.11.2 过渡 .....................................565 11.11.3 状态层 ....................................568 11.11.4 控制参数 ...................................570 11.11.5 约束 .....................................571 11.12 动画控制器 ....................................579 第 12 章 碰撞及刚体动力学 ..............................580 12.1 你想在游戏中加入物理吗 .............................580 12.1.1 物理系统可以做的事情 .............................581 12.1.2 物理好玩吗...................................582 12.1.3 物理对游戏的影响 ...............................583 12.2 碰撞 / 物理中间件 ..................................585 12.2.1 I-Collide、SWIFT、V-Collide 及 RAPID ....................585 12.2.2 ODE .....................................585 12.2.3 Bullet .....................................586 12.2.4 TrueAxis ...................................586 12.2.5 PhysX.....................................586 12.2.6 Havok .....................................587 12.2.7 PAL......................................587 12.2.8 DMM .....................................587 12.3 碰撞检测系统 ....................................588 12.3.1 可碰撞的实体 .................................588 12.3.2 碰撞/物理世界 .................................589 12.3.3 关于形状的概念 ................................590 12.3.4 碰撞原型....................................592 12.3.5 碰撞测试及解析几何 ..............................596 12.3.6 性能优化....................................604 12.3.7 碰撞查询....................................606 12.3.8 碰撞过滤....................................610 12.4 刚体动力学 .....................................611 12.4.1 基础 ......................................613 12.4.2 线性动力学...................................614 12.4.3 运动方程求解 .................................616 12.4.4 数值积分....................................618 12.4.5 二维旋转动力学 ................................622 12.4.6 三维旋转动力学 ................................625 12.4.7 碰撞响应....................................629 12.4.8 约束 ......................................636 12.4.9 控制刚体的运动 ................................640 12.4.10 碰撞/物理步 .................................641 12.5 将物理引擎整合至游戏 ...............................643 12.5.1 连接游戏对象和刚体 ..............................643 12.5.2 更新模拟....................................646 12.5.3 游戏中碰撞及物理的应用例子 ..........................649 12.6 展望 : 高级物理功能 ................................656 第 13 章 音频 ? ......................................658 13.1 声音的物理 .....................................658 13.1.1 声波的属性...................................659 13.1.2 感知响度及分贝 ................................660 13.1.3 声波的传播...................................663 13.1.4 位置的感知...................................668 13.2 声音中的数学知识 .................................668 13.2.1 信号 ......................................669 13.2.2 处理信号....................................670 13.2.3 线性时不变系统 ................................671 13.2.4 LTI 系统的脉冲响应 ..............................672 13.2.5 频域与傅里叶变换 ...............................677 13.3 声音技术 ......................................685 13.3.1 模拟音频技术 .................................685 13.3.2 数字音频技术 .................................690 13.4 三维音频渲染 ....................................696 13.4.1 三维声音渲染概览 ...............................697 13.4.2 为音频世界建模 ................................698 13.4.3 基于距离的衰减 ................................698 13.4.4 偏移 ......................................700 13.4.5 传播、混响及声学................................705 13.4.6 多普勒频移...................................712 13.5 音频引擎架构 ....................................712 13.5.1 音频处理管道 .................................714 13.5.2 概念及术语...................................714 13.5.3 音总线.....................................715 13.5.4 主控混音器...................................718 13.5.5 主控输出总线 .................................719 13.5.6 实现总线....................................720 13.5.7 资产管理....................................722 13.5.8 对游戏混音...................................724 13.5.9 音频引擎调查 .................................727 13.6 游戏专用的音频功能 ................................730 13.6.1 支持切割屏...................................731 13.6.2 角色对话....................................732 13.6.3 音乐 ......................................744 第 IV 部分 游 戏 性 第 14 章 游戏性系统简介 ...............................747 14.1 剖析游戏世界 ....................................748 14.1.1 世界元素....................................748 14.1.2 世界组块....................................750 14.1.3 高级游戏流程 .................................751 14.2 实现动态元素 : 游戏对象 ..............................752 14.2.1 游戏对象模型 .................................753 14.2.2 工具方的设计和运行时的设计 ..........................754 14.3 数据驱动游戏引擎 .................................754 14.4 游戏世界编辑器 ..................................755 14.4.1 游戏世界编辑器的典型功能 ...........................758 14.4.2 集成的资产管理工具 ..............................763 第 15 章 运行时游戏性基础系统 ...........................766 15.1 游戏性基础系统的组件 ...............................766 15.2 各种运行时对象模型架构 .............................768 15.2.1 以对象为中心的各种架构 ............................769 15.2.2 以属性为中心的各种架构 ............................781 15.3 世界组块的数据格式 ................................785 15.3.1 二进制对象映像 ................................786 15.3.2 序列化游戏对象描述 ..............................786 15.3.3 生成器及类型架构 ...............................788 15.4 游戏世界的加载和串流 ...............................792 15.4.1 简单的关卡加载 ................................792 15.4.2 向无缝加载进发: 阻隔室 ............................792 15.4.3 游戏世界的串流 ................................794 15.4.4 对象生成的内存管理 ..............................796 15.4.5 游戏存档....................................798 15.5 对象引用与世界查询 ................................799 15.5.1 指针 ......................................799 15.5.2 智能指针....................................800 15.5.3 句柄 ......................................802 15.5.4 游戏对象查询 .................................804 15.6 实时更新游戏对象 .................................806 15.6.1 一个简单 (但不可行) 的方式...........................807 15.6.2 性能限制及批次式更新 .............................809 15.6.3 对象及子系统的相互依赖 ............................811 15.6.4 为并行设计...................................819 15.7 事件与消息泵 ....................................821 15.7.1 静态类型的函数绑定带来的问题 .........................821 15.7.2 把事件封装成对象 ...............................822 15.7.3 事件类型....................................823 15.7.4 事件参数....................................824 15.7.5 事件处理器...................................826 15.7.6 取出事件参数 .................................827 15.7.7 职责链.....................................827 15.7.8 登记对事件的关注 ...............................829 15.7.9 要排队还是不要排队 ..............................830 15.7.10 即时传递事件带来的问题............................835 15.7.11 数据驱动事件/消息传递系统 ..........................836 15.8 脚本 .........................................839 15.8.1 运行时与数据定义的对比 ............................839 15.8.2 编程语言特性 .................................839 15.8.3 一些常见的游戏脚本语言 ............................841 15.8.4 脚本所需的架构 ................................846 15.8.5 运行时游戏脚本语言的功能 ...........................847 15.9 高层次的游戏流程 .................................858 第 V 部分 总 结 第 16 章 还有更多内容吗 ...............................863 16.1 一些未谈及的引擎系统 ...............................863 16.1.1 影片播放器...................................863 16.1.2 多人网络....................................864 16.2 游戏性系统 .....................................864 16.2.1 玩家机制....................................864 16.2.2 摄像机.....................................864 16.2.3 人工智能....................................865 16.2.4 其他游戏性系统 ................................866 参考文献 ..........................................867 中文索引 ..........................................871 英文索引 ..........................................900

作者简介

编辑推荐

作者寄语

电子资料

www.luweidong.cn

下一个