游戏引擎架构

游戏引擎架构

宣传语:迈向现代游戏之路完美入口 业界万众企盼 隆重推荐

作者:【美】Jason Gregory(杰森.格雷戈瑞) 著

译者:叶劲峰 译

ISBN: 978-7-121-22288-7

出版时间:2014年1月出版

定价:128.00元

页数:800页

开本:16开

编辑推荐

《游戏引擎架构》由游戏界传奇人物云风及“天天爱消除”团队倾情作序推荐,既是游戏工作者必读Bible,对其他IT从业者也不无裨益。

內容包括:

- 游戏开发中的大规模C++软件架构

- 游戏编程所需的数学

- 供调试、源代码控制及性能剖析的游戏开发工具

- 引擎基础系统、渲染、碰撞、物理、角色动画、游戏世界对象模型等引擎子系统

- 多平台游戏引擎

- 多处理器环境下的游戏编程

- 工作管道及游戏资产数据库

内容提要

《游戏引擎架构》同时涵盖游戏引擎软件开发的理论及实践,并对多方面的题目进行探讨。本书讨论到的概念及技巧实际应用于 现实中的游戏工作室,如艺电及顽皮狗。虽然书中采用的例子通常依据一些专门的技术,但是讨论范围远超于某个引擎或API。文中的参考及引用也非常有用,可 让读者继续深入游戏开发过程的任何特定方向。

《游戏引擎架构》为一个大学程度的游戏编程课程而编写,但也适合软件工程师、业余爱好者、自学游戏程序员,以及游戏产业 的从业人员。通过阅读《游戏引擎架构》,资历较浅的游戏工程师可以巩固他们所学的游戏技术及引擎架构的知识,专注某一领域的资深程序员也能从本书更为全面 的介绍中获益。


目录

推荐序1 iii

推荐序2 v

译序         vii

序言         xvii

前言         xix

致谢         xxi

第一部分  基础     1

第1章  导论          3

1.1 典型游戏团队的结构      4

1.2 游戏是什么      7

1.3 游戏引擎是什么      10

1.4 不同游戏类型中的引擎差异 11

1.5 游戏引擎概观 22

1.6 运行时引擎架构      27

1.7 工具及资产管道      46

第2章  专业工具          53

2.1 版本控制 53

2.2 微软Visual Studio    61

2.3 剖析工具 78

2.4 内存泄漏和损坏检测      79

2.5 其他工具 80

第3章  游戏软件工程基础          83

3.1 重温C++及最佳实践       83

3.2 C/C++的数据、代码及内存     90

3.3 捕捉及处理错误      118

第4章  游戏所需的三维数学     125

4.1 在二维中解决三维问题 125

4.2 点和矢量 125

4.3 矩阵 139

4.4 四元数      156

4.5 比较各种旋转表达方式 164

4.6 其他数学对象 168

4.7 硬件加速的SIMD运算   173

4.8 产生随机数      180

第二部分  低阶引擎系统     183

第5章  游戏支持系统          185

5.1 子系统的启动和终止      185

5.2 内存管理 193

5.3 容器 208

5.4 字符串      225

5.5 引擎配置 234

第6章  资源及文件系统     241

6.1 文件系统 241

6.2 资源管理器      251

第7章  游戏循环及实时模拟     277

7.1 渲染循环 277

7.2 游戏循环 278

7.3 游戏循环的架构风格      280

7.4 抽象时间线      283

7.5 测量及处理时间      285

7.6 多处理器的游戏循环      296

7.7 网络多人游戏循环 304

第8章  人体学接口设备(HID)       309

8.1 各种人体学接口设备      309

8.2 人体学接口设备的接口技术 311

8.3 输入类型 312

8.4 输出类型 316

8.5 游戏引擎的人体学接口设备系统 318

8.6 人体学接口设备使用实践      332

第9章  调试及开发工具     333

9.1 日志及跟踪      333

9.2 调试用的绘图功能 337

9.3 游戏内置菜单 344

9.4 游戏内置主控台      347

9.5 调试用摄像机和游戏暂停      348

9.6 作。弊 348

9.7 屏幕截图及录像      349

9.8 游戏内置性能剖析 349

9.9 游戏内置的内存统计和泄漏检测 356

第三部分  图形及动画         359

第10章  渲染引擎       361

10.1 采用深度缓冲的三角形光栅化基础   361

10.2 渲染管道        404

10.3 高级光照及全局光照   426

10.4 视觉效果和覆盖层        438

10.5 延伸阅读        446

第11章  动画系统       447

11.1 角色动画的类型   447

11.2 骨骼        452

11.3 姿势        454

11.4 动画片段        459

11.5 蒙皮及生成矩阵调色板        471

11.6 动画混合        476

11.7 后期处理        493

11.8 压缩技术        496

11.9 动画系统架构        501

11.10 动画管道      502

11.11 动作状态机 515

11.12 动画控制器 535

第12章  碰撞及刚体动力学       537

12.1 你想在游戏中加入物理吗   537

12.2 碰撞/物理中间件  542

12.3 碰撞检测系统        544

12.4 刚体动力学   569

12.5 整合物理引擎至游戏   601

12.6 展望:高级物理功能   616

第四部分  游戏性         617

第13章  游戏性系统简介   619

13.1 剖析游戏世界        619

13.2 实现动态元素:游戏对象   623

13.3 数据驱动游戏引擎        626

13.4 游戏世界编辑器   627

第14章  运行时游戏性基础系统       637

14.1 游戏性基础系统的组件        637

14.2 各种运行时对象模型架构   640

14.3 世界组块的数据格式   657

14.4 游戏世界的加载和串流        663

14.5 对象引用与世界查询   670

14.6 实时更新游戏对象        676

14.7 事件与消息泵        690

14.8 脚本        707

14.9 高层次的游戏流程        726

第五部分  总结     727

第15章  还有更多内容吗   729

15.1 一些未谈及的引擎系统        729

15.2 游戏性系统   730

参考文献         733

中文索引         737

英文索引         755

精彩节摘

推荐序1

最初拿到《Game Engine Architecture》一书的英文版,是编辑侠少邮寄给我的打印版。他建议我接下翻译此书的合同。当时我正在杭州带领一个团队开发3D游戏引擎,我和 我的同事都对这本书的内容颇有兴趣,两大本打印的英文书立刻在同事间传开。可惜那段时间个人精力顾及不来,把近千页的英文读物精读而后翻译成中文对个人的 业余时间是个极大的挑战,不能担此翻译任务颇为遗憾。

不久以后听说Milo Yip(叶劲峰)已开始着手翻译,甚为欣喜。翻译此巨著,他一定是比我更合适的人选。我和Milo虽未曾蒙面,但神交已久。在网络上读过一些他的成长经 历,和我颇为相似,心有戚戚。他对游戏3D实时渲染技术研究精深为我所不及,我们曾通过Google Talk讨论过许多技术问题,他都有独到的见解。翻译工作开始后,Milo是香港人,英文技术术语在香港的中文译法和大陆的有许多不同。但此书由大陆出版 社出版,考虑到面对的读者主要是大陆程序员,Milo希望能更符合大陆程序员的用词习惯,所以在翻译一开始就通过Google Docs创建了协作页面,邀请大家共同探讨书中技术名词的中译名。从中我们可以一窥他作为译者的慎重。

三年之后,有幸在出版之前就拿到了完整的译本。这是一本用LaTeX精心排版的800页的电子书,我只花了一周时间,几乎是一口气读完。流畅的阅读享受,绝对不仅仅是因为原著精彩的内容,精美的版面和翔实的译注也加了不少分。

在阅读本书的过程中,我不只一次地获得共鸣。例如在第5章的内存管理系统的介绍中,作者介绍的几种游戏特有的内存管理方法我都曾在项目中用过,而这 是第一次有书籍专门将这些方法详尽记录;又如第11章动画系统的介绍,我们也同样在3D引擎开发过程中改进原有动画片段混合方法的经历。虽然书中介绍的每 个技术点,都可能可以在某篇论文,某本其他的书的章节,某篇网络blog上见过,但之前却无一本书可以把这些东西放在一起相互参照。对于从事游戏引擎开发 的程序员来说,了解各种引擎在处理每个具体问题时的方案是相当重要的。而每种方案又各有利弊,即使不做引擎开发工作而是在某一特定游戏引擎上做游戏开发, 从中也可以理解引擎的局限性以及可能的改进方法。尤其是第14章介绍的对游戏性相关系统的设计,各个开发人员几乎都是凭经验设计,很少见有书籍对这些做总 结。对于基于渲染引擎做开发的游戏程序员,这是必须面对的工作,这一章会有很大的借鉴意义。

本书作者是业内资深的游戏引擎开发人,他所参于的《神秘海域》和《最后生还者》都是我的个人最爱。在玩游戏的过程中,作为游戏程序员的天性,自然会 不断地猜想各个技术点是如何实现的,背后需要怎样的工具支持。能在书中一一得到印证是件特别开心的事情。作者反复强调代码实践的重要性,在书中遍布着 C++代码。我不认为这些代码有直接取来使用的价值,但它们极大地帮助了读者理解书中的技术点。书中列出的顽皮狗工作室用lisp方言作为游戏配置脚本的 范例也给我很大的启发,有了这些具体的代码示例以及作者本身的一线工程师背景,也让我确信书中那些关于主机游戏开发相关等,我所没有接触过的内容都也绝非 泛泛而谈。

国内的游戏开发社区的壮大,主要是随最近十年的MMO风潮而生。而就在大型网络游戏在中国有些畸形发展,让这类游戏偏离电子游戏游戏性的趋势时,我 们有幸迎来了为移动设备开发游戏的大潮。游戏开发的重心重新回到游戏性本身。我们更需要去借鉴单机游戏是如何为玩家带来更纯粹的游戏体验,我相信书中记录 的各种技术点会变的更有帮助。

                                                                                                       云风 @简悦云风

推荐序2

在我认识的许多游戏业开发同仁中,只有少数香港同胞,Milo Yip(叶劲峰)却正是这样一位给我印象非常深刻的优秀香港游戏开发者。我俩认识,是在Milo加入腾讯互动娱乐研发部引擎技术中心后,说来到现在也只是 两年多时间。其间,他为人的谦逊务实,对待技术问题的严谨求真态度,对算法设计和性能优化的娴熟技术,都为人所称道。Milo一丝不苟的工作风格,甚至表 现在对待技术文档排版这类事情上(Milo常执著地用LaTeX将技术文档排到完美),我想这一定是他在香港读大学、硕士及在香港理工大学的多媒体创新中 心从事研究员,一贯沿袭至今的好作风。

我很高兴腾讯游戏有实力吸引到这样优秀的技术专家;即使在其已从上海迁回香港家中,依然选择到深圳腾讯互动娱乐总部工作。叶兄从此工作日每天早晚过关,来往香港和深圳两地,虽有舟车劳顿,但是兼顾了对家庭的照顾和在游戏引擎方面的专业研究,希望这样的状况是令他满意的。

认识叶兄当时,我便知道他在进行Jason Gregory所著《游戏引擎架构》一书的中译工作。因为自己从前也有业余翻译游戏开发有关书籍的经历,所以我能理解其中的辛苦和责任重大,对叶兄也更多 一分钦佩。我以为,本书以及本书的中文读者最大的幸运便是,遇到叶兄这位对游戏有着如同对家对国般强烈责任感,犹如“游戏科学工作者”般的专业译者!

现在(2013年年末)无疑是游戏史上对独立游戏制作者最友好的年代。开发设备方便获得(相对过往仅由主机厂商授权才能获得专利开发设备,现在有一 台智能手机和一台个人电脑就可以开发)、技术工具友好、调试过程简单方便,且互联网上有丰富的例程和开源代码参考,也有网上社区便于交流。很多爱好者能够 很快地制作出可运行的游戏原型,其中一些也能发布到应用商店。

但是不全面掌握各方面知识,尤其是游戏引擎架构知识,往往只能停留在勉强修改、凑合重用别人提供的资源的应用程度上,难以做极限的性能改进,更妄谈 革命式的架构创新。这样的程度是很难在成千上万的游戏中脱颖而出的。我们所认可的真正的游戏大作,必定是在某方面大幅超越用户期待的产品。为了打造这样的 产品,游戏内容创作者(策划、美术等)需要“戴着镣铐跳舞”(在当前的机能下争取更多的创作自由度),而引擎架构合理的游戏可以经得起也值得进行反复优 化,最终可以提供更多的自由度,这是大作出现的技术前提。

书的作者、译者、出版社的编者,加上读者,大家是因书而结缘的有缘人。因叶兄这本《游戏引擎架构》译著而在线上线下相识的读者们,你们是不是因“了解游戏引擎架构,从而制作/优化好游戏”这样的理想而结了缘呢?

亲爱的读者,愿你的游戏有一天因谜题巧妙绝伦、趣味超凡、虚拟世界气势磅礴、视觉效果逼真精美等专业因素取得业界褒奖,并得到玩家真诚的赞美。希望 届时曾读叶兄这本《游戏引擎架构》译作的你,也可以回馈社会,回馈游戏开发的学习社区,帮助新人。希望你也可以建立微信公众号、博客等,或翻译游戏开发书 籍,造福外语不好的读者,所以如果你的外语(英语、日语、韩语之于游戏行业比较重要)水平仍需精进,现在也可以同步加油了!

                                                                                                          沙鹰  @也是沙鹰

译序

数千年以来,艺术家们通过文学、绘画、雕塑、建筑、音乐、舞蹈、戏剧等传统艺术形式充实人类的精神层面。自20世纪中叶,计算机的普及派生出另一种 艺术形式电子游戏。游戏结合了上述传统艺术以及近代科技派生的其他艺术(如摄影、电影、动画),并且完全脱离了艺术欣赏这种单向传递的方式游戏必然是互动 的,“玩家”并不是“读者”、“观众”或“听众”,而是进入游戏世界、感知并对世界做出反应的参与者。

基于游戏的互动本质,游戏的制作通常比其他大众艺术复杂。商业游戏的制作通常需要各种人才的参与,而他们则需要依赖各种工具及科技。游戏引擎便是专 门为游戏而设计的工具及科技集成。之所以称为引擎,如同交通工具中的引擎,提供了最核心的技术部分。因为复杂,研发成本高,人们不希望制作每款游戏(或车 款)时都重新设计引擎,重用性是游戏引擎的一个重要设计目标。

然而,各游戏本身的性质以及平台的差异,使研发完全通用的游戏引擎变得极困难,甚至不可能。市面上出售的游戏引擎,有一些虽然已经达到很高的技术水 平,但在商业应用中,很多时候还是需要因应个别游戏项目对引擎改造、整合、扩展及优化。因此,即使能使用市面上最好的商用引擎或自研引擎,我们仍需要理解 当中的架构、各种机制和技术,并且分析及解决在制作中遇到的问题。这些也是译者曾任于上海两家工作室时的主要工作范畴。

选择翻译此著作,主要原因是在阅读中得到共鸣,并且能知悉一些知名游戏作品实际上所采用的方案。有感坊间大部分游戏开发书籍并不是由业内人士执笔, 内容只足够应付一些最简单的游戏开发,欠缺宏观比较各种方案,技术与当今实际情况也有很大差距。而一些Gems类丛书虽然偶有好文章,但受形式所限欠缺系 统性、全面性。难得本书原作者身为世界一流游戏工作室的资深游戏开发者,在繁重的游戏开发工作外,还在大学教授游戏开发课程以至编写本著作。此外,从与内 地同事的交流中,了解到许多从业者不愿意阅读外文书籍。为了普及知识及反馈业界社会,希望能尽绵力。

或许有些人以为本著作是针对单机/游戏机游戏的,并不适合国内以网游为主的环境。但译者认为这是一种误解,许多游戏本身所涉及的技术是具通用性的。 例如游戏性相关的游戏性系统、场景管理、人工智能、物理模拟等部分,许多时候也会同时用于网游的前台和后台。现时,一些动作为主、非MMO的国内端游甚至 会直接在后台运行传统意义上的游戏引擎。至于前台相关的技术,单机和端游的区别更少。此外,随着近年移动终端的兴起,其硬件性能已超越传统掌上游戏机,开 发手游所需的技术与传统掌上游戏机并无太大差异。还可预料,现时单机/游戏机的一些较高级的架构及技术,将在不远的未来着陆移动终端平台。

译者认为,本书涵括游戏开发技术的方方面面,同时适合入门及经验丰富的游戏程序员。书名中的架构二字,并不单是给出一个系统结构图,而是描述每个子 系统的需求、相关技术及与其他子系统的关系。对译者本人而言,本书的第11章(动画系统)及第14章(运行时游戏性基础系统)是本书特別精彩之处,含有许 多少见于其他书籍的内容。而第10章(渲染引擎)由于是游戏引擎中的一个极大的部分,有限的篇幅可能未能覆盖广度及深度,推荐读者参考[1],人工智能方 面也需参考其他专著。

本译作采用LaTeX排版,以Inkscape编译矢量图片。为了令阅读更流畅,内文中的网址都统一改以脚注标示。另外,由于现时游戏开发相关的文 献以英文为主,而且游戏开发涉及的知识面很广,本译作尽量以括号形式保留英文术语。为了方便读者查找内容,在附录中增设中英文双向索引(索引条目与原著的 不同)。

本人在香港成长学习及工作,至2008年才赴内地游戏工作室工作,不黯内地的中文写作及用字习惯,翻译中曾遇到不少困难。有幸得到出版社人员以及良 师益友的帮助,才能完成本译作。特别感谢周筠老师支持本作的提案,并耐心地给予协助及鼓励。编辑张春雨老师和卢鸫翔老师,以及好友余晟给予了大量翻译上的 知识及指导。也感谢游戏业界专家云风、大宝和Dave给予了许多宝贵意见。此书的翻译及排版工作比预期更花时间,感谢妻子及儿女们的体谅。此次翻译工作历 时三年半,因工作及家庭事宜导致严重延误,唯有在翻译及排版工作上更尽心尽力,希望求得等待此译作的读者们谅解。无论是批评或建议,诚希阁下通过电邮、新 浪微博、豆瓣等渠道不吝赐教。

                                                                                                                       叶 劲峰(Milo Yip)                                                                                                                       2013 年10月

作者简介

作者介绍:Jason Gregory在1994年开始任职专业软件工程师,自1999年3月开始在游戏产业中任职软件工程师。在圣迭哥Midway Home Entertainment公司开始游戏编程的他,为《疯狂飞行员(Freaky Flyers)》及《Crank theWeasel》开发PlayStation 2/Xbox上的动画系统。在2003年,他转到洛杉矶艺电,为《荣誉勋章:血战太平洋(Medal of Honor: Pacific Assault)》开发游戏引擎及游戏性技术,并在《荣誉勋章:空降神兵(Medal of Honor: Airborne)》中担任首席工程师。他现时是顽皮狗公司的通才程序员,为《神秘海域:德雷克船长的宝藏(Uncharted: Drake's Fortune)》及《神秘海域:纵横四海(Uncharted: Among Thieves)》开发引擎及游戏性软件。他也在南加州大学教授游戏技术的课程。

译者简介:叶劲峰(Milo Yip)从小自习编程,并爱好计算机图形学。上中学时兼职开发策略RPG《王子传奇》,该游戏在1995年于台湾发行。其后他获取了香港大学认知科学学 士、香港中文大学系统工程及工程管理哲学硕士。毕业后在香港理工大学设计学院从事游戏引擎及相关技术的研发,职至项目主任。除发表学术文章外,也曾合著 《DirectX9游戏编程实务》。2008年往上海育碧担任引擎工程师开发《美食从天而降(Cloudy with a Chance of Meatballs)》Xbox360/PS3/Wii/PC,2009年起于麻辣马开发《爱丽丝:疯狂回归(Alice: Madness Returns)》Xbox360/PS3/PC,2011年加入腾讯互动娱乐引擎技术中心担任专家工程师,所研发的技术已用于《斗战神》、《天涯明月 刀》、《众神争霸》等项目中。

 


媒体评论

本书针对每一个现代游戏开发相关的重要系统和话题,给出一个完美、综合的概览,无论是计算机科学、软件工程,或是游戏主程,以及业余爱好者、游戏玩家,本书均不可或缺。

——获评CHOICE杰出学术作品

……这里有最专业的领域知识与概念讲解……有了它,你将具备对如何构建游戏引擎的深入理解……本书让人印象尤其深刻,因为该领域再也找不到另一本如此详尽的图书。

——Eric Haines,www.realtimerendering.com/blog/

作者将数年经验及专业积累集中在这本完整、全面的著作中,内容跨越游戏引擎开发理论与实践。书中提供的游戏开发过程各方面的精彩实例,保罗万象且对 读者大有补益。不仅游戏引擎开发人员看后会大受鼓舞,甚至也可作为有经验的该领域技术专家的实用参考。本书可谓无价,除内容“用户友好”外,其附录也值得 强烈推荐,无论是个人开发者、专家还是计算机科学学术人员,都可将其作为资源集合与参考资料,当然游戏设计架构人员更是不可不读。

——The Midwest Book Review

本书涵盖有关如何开发游戏引擎要旨的巨量数据。

——Gamasutra.com, November 2009

本书曾位列“the Game Developer”杂志前沿大奖候选图书。

——PR Newswire

前言

欢迎来到《游戏引擎架构》世界。本书旨在全面探讨典型商业游戏引擎的主要组件。游戏编程是一个庞大的主题,有许多内容需要讨论。不过相信你会发现, 我们讨论的深度将足以使你充分理解本书所涵盖的工程理论及常用实践的方方面面。话虽如此,令人着迷的漫长游戏编程之旅其实才刚刚启程。与此相关的每项技术 都包含丰富内容,本书将为你打下基础,并引领你进入更广阔的学习空间。

本书焦点在于游戏引擎的技术及架构。我们会探讨商业游戏引擎中,各个子系统的相关理论,以及实现这些理论所需要的典型数据结构、算法和软件接口。游 戏引擎与游戏的界限颇为模糊。我们将把注意力集中在引擎本身,包括多个低阶基础系统(low-level foundation system)、渲染引擎(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)及人工智能(artificialintelligence,AI)。然而,这类讨论会被限制在游戏性系统 和引擎接口范围。    

本书可以作为大学中等级游戏程序设计中两到三门课程的教材。当然,本书也适合软件工程师、业余爱好者、自学的游戏程序员,以及游戏行业从业人员。通 过阅读本书,资历较浅的游戏程序员可以巩固他们所学的游戏数学、引擎架构及游戏科技方面的知识。专注某一领域的资深程序员也能从本书更为全面的介绍中获 益。

为了更好地学习本书内容,你需要掌握基本的面向对象编程概念并至少拥有一些C++编程经验。尽管游戏行业已经开始尝试使用一些新的、令人兴奋的编程 语言,然而工业级的3D游戏引擎仍然是用C或C++编写的,任何认真的游戏程序员都应该掌握C++。我们将在第3章重温一些面向对象编程的基本原则,毫无 疑问,你还会从本书学到一些C++的小技巧,不过C++的基础最好还是通过阅读[39]、[31]及[32]来获得。如果你对C++已经有点生疏,建议你 在阅读本书的同时,最好能重温这几本或者类似书籍。如果你完全没有C++经验,在看本书之前,可以考虑先阅读[39]的前几章,或者尝试学习一些C++的 在线教程。

学习编程技能最好的方法就是写代码。在阅读本书时,强烈建议你选择一些特别感兴趣的主题付诸实践。举例来说,如果你觉得人物动画很有趣,那么可以首 先安装OGRE,并测试一下它的蒙皮动画示范。接着还可以尝试用OGRE实现本书谈及的一些动画混合技巧。下一步你可能会打算用游戏手柄控制人物在平面上 行走。等你能玩转一些简单的东西了,就应该以此为基础,继续前进!之后可以转移到另一个游戏技术范畴,周而复始。这些项目是什么并不重要,重要的是你在实 践游戏编程的艺术,而不是纸上谈兵。

游戏科技是一个活生生、会呼吸的家伙 ,永远不可能将之束缚于书本之上。因此,附加的资源、勘误、更新、示例代码、项目构思等已经发到本书的网站。

猜你喜欢

转载自shangjin615.iteye.com/blog/2019329