图解游戏引擎基础框架与实现原理

978-7-115-67449-4
作者: 陆泽西
译者:
编辑: 杨绣国

图书目录:

详情

本书是一部全面且通俗易懂的游戏引擎技术学习指南,旨在帮助读者深入理解游戏引擎核心模块的架构、工作机制与实现原理。全书共 10 章,从基础到进阶,通过图示系统呈现引擎各模块知识。 第 1 章主要介绍游戏引擎的发展史与组成结构,让读者了解引擎演进脉络与整体框架,为后续深入学习搭建知识桥梁。第 2 章涵盖对象模型、字符串管理、容器、宏与模板技巧、离线生成代码等基础知识,为引擎开发筑牢根基。第 3 章至第 9 章分别针对动画、UI、内存管理、渲染管线、虚拟机、粒子系统、资产管理等模块展开,从原理剖析到具体引擎实现,结合图示深入讲解关键技术与流程。第 10 章介绍引擎多线程工作原理。 本书适合从事游戏开发相关工作的技术人员、设计人员以及相关专业学生阅读,是系统学习游戏引擎内部原理的实用指南。

图书摘要

版权信息

书名:图解游戏引擎:基础框架与实现原理

ISBN:978-7-115-67449-4

本书由人民邮电出版社发行数字版。版权所有,侵权必究。

您购买的人民邮电出版社电子书仅供您个人使用,未经授权,不得以任何方式复制和传播本书内容。

我们愿意相信读者具有这样的良知和觉悟,与我们共同保护知识产权。

如果购买者有侵权行为,我们可能对该用户实施包括但不限于关闭该帐号等维权措施,并可能追究法律责任。

版  权

著    陆泽西

责任编辑 杨绣国

人民邮电出版社出版发行  北京市丰台区成寿寺路11号

邮编 100164  电子邮件 315@ptpress.com.cn

网址 http://www.ptpress.com.cn

读者服务热线:(010)81055410

反盗版热线:(010)81055315

内 容 提 要

本书是一部全面且通俗易懂的游戏引擎技术学习指南,旨在帮助读者深入理解游戏引擎核心模块的架构、工作机制与实现原理。全书共10章,从基础到进阶,通过图示系统呈现引擎各模块知识。

第1章主要介绍游戏引擎的发展史与组成结构,让读者了解引擎演进脉络与整体框架,为后续深入学习搭建知识桥梁。第2章涵盖对象模型、字符串管理、容器、宏与模板技巧、离线生成代码等基础知识,为引擎开发筑牢根基。第3章至第9章分别针对动画、UI、内存管理、渲染管线、虚拟机、粒子系统、资产管理等模块展开,从原理剖析到具体引擎实现,结合图示深入讲解关键技术与流程。第10章介绍引擎多线程工作原理。

本书适合从事游戏开发相关工作的技术人员、设计人员以及相关专业学生阅读,是系统学习游戏引擎内部原理的实用指南。

献给女儿,陆秀恩、陆安妮

让每个技巧都得以沉淀

学无止境,犹如天际之辽阔。

推荐语

大咖赞誉

作为长期从事引擎工具开发的技术美术,我深知理解引擎底层架构对工具开发的决定性作用。本书以独特的可视化解析手法,将抽象复杂的引擎架构与开发知识转化为直观图例,这正是开发者梦寐以求的“技术地图”。书中针对各核心模块,分别结合Unreal与Unity两大主流平台展开详解,使读者既能快速掌握即学即用的实战技能,又能逐步理解不同引擎的设计哲学。推荐给每一位希望深入掌握游戏引擎底层架构的开发者!

—— 陈慧鹏 祖龙娱乐引擎部TA组负责人

本书从游戏开发者的视角出发,深入解析引擎底层原理,系统讲解引擎设计的核心要点,并细致剖析关键技术细节。无论是从引擎架构角度理解整体设计,还是从在实际开发中遇到的问题与痛点入手探寻本质,本书都提供了扎实的理论支撑与实用的方法指导。它既是一本理论著作,也是一本实战工具书,是游戏开发者学习与掌握引擎技术的实用指南。

—— 曾宏 乐享元游CTO

本书最大的价值在于同时深入解析了Unity与Unreal两大主流引擎的核心技术,从渲染管线、粒子系统、虚拟机技术,到 UI 框架与动画系统,每个模块均通过精心设计的图解将抽象概念具象化。对于希望从使用引擎过渡到理解引擎的开发者,本书无疑是一座不可多得的知识宝库。

—— 李杰 完美世界前主程 恺英网络现主程

当复杂的引擎原理邂逅直观的图形拆解,本书让晦涩难懂的技术细节一目了然!本书通过大量精准示意图与流程图把 Unity 底层架构、渲染管线、物理系统等核心模块“解剖”在读者眼前。无论是内存管理优化中的堆栈分布,还是 Shader 渲染的逐帧运算逻辑,图文对照的讲解方式都能让读者如观看“技术 X 光片”般透彻理解引擎运作机制。本书特别适合希望从会“用 Unity”进阶到“懂 Unity”的开发者,助其从此告别性能调优中的盲目试错!

—— 蔡贵厚 广州厉天科技CTO

身为资深游戏主程,作者将多年实战经验与性能优化心得倾囊相授。他基于图解视角,化繁为简,将深奥的游戏引擎原理转化为清晰直观的视觉语言。书中系统剖析了渲染、动画、UI、粒子、虚拟机等核心模块的底层实现,并贯穿Unity与Uureal两大主流引擎的深度对比,辅以精准图示与精练代码,层层递进,抽丝剥茧。本书既能帮助初学者建立系统认知,也能助力资深开发者查漏补缺、精进技艺,是所有游戏开发者及引擎爱好者的案头宝典。

—— 斑马 尚游网络主程

我有幸师从《Unity 3D 高级编程:主程手记》的作者,那段参与性能优化工具开发的经历,无疑是我技术生涯中至关重要的转折点。作者独具匠心的编程逻辑与架构设计,犹如庖丁解牛般将复杂系统抽丝剥茧、层层拆解,令我深受启发。

近日听闻其新作即将付梓,我第一时间研读了渲染管线章节。书中,作者以深入浅出的笔触将引擎核心模块的数学原理与工程实现融会贯通,秉持“知其然,更知其所以然”的写作理念,成功为我打通了实时图形学的认知闭环——那些原本碎片化的知识,自此升维为系统化的技术框架。

这两部著作堪称开发者进阶之路的灯塔:前者为开发者筑牢内功根基,后者助力开拓视野疆界。在此,我诚挚地将它们推荐给每一位追求卓越的开发者同行!

—— CodeMonking

网友评语

作为一名拥有二十年几何建模与渲染领域工作经验的技术从业者,近年来我对游戏引擎架构原理产生了浓厚的探索兴趣。本书的出版令我满怀期待,尤其是其中对并行渲染技术与实时渲染技术的深入剖析。目前,国内具备此类技术深度的专业图书较为稀缺。过去,我主要依靠外版著作来获取此类知识,未曾想到,国内竟有如此深耕一线、兼具理论高度与工程实践的工程师将宝贵经验凝结成书。本书堪称游戏引擎领域从业人员的参考宝典,深具收藏与研读价值。

—— 无天

此前我便被作者所著《Unity 3D 高级编程:主程手记》深深吸引。书中对 Unity 主程所需核心能力的系统梳理,脉络清晰、由浅入深,令我受益匪浅。因此,我一直密切关注作者新作的进展。通读新作部分样章后,我确信这不仅是一本讲清游戏引擎如何工作的技术指南,更是能启发读者深入思考为何如此设计的思维导引。无论你是希望构建自研引擎,还是意图洞悉商业引擎底层原理,本书都值得置于案头,反复研读。

—— 吴卬

本书是市面上少有的对Unity与Unreal两大游戏引擎进行系统性深度解析的技术专著,非常适合那些对引擎底层机制充满好奇的游戏开发者和技术爱好者阅读。随着国内游戏产业的持续发展,越来越多的项目和从业者迫切需要更深入、更高质量的技术内容——本书正是对这一需求的有力回应。衷心感谢作者无私开放的技术分享。

—— 朱少童(Dalton)

对于游戏开发初学者而言,游戏引擎常常如同一个神秘的“黑箱”,本书正是为打开这一“黑箱”而作。本书采用循序渐进的方式,以可视化手段拆解复杂概念,借助简洁明了的图表和通俗易懂的语言,将一个个抽象的模块转化为直观可感的知识,助力读者构建对游戏引擎架构的整体认知,从而更高效地运用游戏引擎。

本书最大的亮点在于既秉持技术的严谨性,又注重学习的友好性。它并非编程手册,而是系统结构的导览图;不是 API 教程,而是设计思想的引领者。无论你是初涉游戏开发的新手,还是致力于高级引擎开发研究的进阶者,本书都是一本有价值的技术读物。

—— 张玉乐

当前市面上关于游戏开发的图书数量众多,但真正深入探讨游戏引擎原理的却寥寥无几,多数图书的内容仅围绕 Unity、Unreal引擎展开,顶多再提及 Godot。而少数涉及引擎架构的“大部头”作品又往往过于晦涩艰深,令人望而生畏。毕竟,并非每一位开发者都拥有如同世嘉(SEGA)当年在“小黑书”相关项目开发过程中所展现出的那种能力——从零开始,“手工打造”游戏引擎。然而,近些年,引擎厂商在商业和使用权方面发生了巨大变化,由此引发的游戏制作危机不容忽视:开发者在制作过程中常因无法灵活调整功能而反复返工;一旦尝试修改引擎源码,又极易陷入海量 Bug 的泥潭;更不必说被层层叠加的冗余代码与历史补丁压得喘不过气。

如果你是技术初学者,或是一位热衷于解包分析、Mod 制作的深度游戏爱好者,希望了解什么是游戏引擎、现代游戏如何运作,并尝试构建属于自己的轻量级引擎,又或者希望在现有引擎的基础上开发出独具特色的功能,甚至将其适配到游戏之外的工作流程中,例如动画制作、仿真模拟、虚拟拍摄等领域,那么我诚挚推荐你阅读本书。相信你在入门阶段,定能获得系统而清晰的认知与启发。

—— 黄翔宇

如今,游戏的内容和表现力已极为丰富,且仍在持续快速发展。为了能够高效地制作出精良的游戏产品,行业对于深入理解游戏引擎的需求正变得越来越高。然而,主流商业游戏引擎愈发庞大复杂,对于有意愿了解游戏引擎的人来说,其学习门槛和难度也在不断提高。本书恰似久旱后的甘霖,是一份难得的宝藏。作者拥有丰富的游戏开发经验,在业界备受关注与好评。期待本书能帮助更多开发者夯实基础、拓展视野。

—— 一个游戏开发老兵 聚焦游戏引擎、UGC和AIGC

推荐序

我们碳基生命体天生具有强烈的好奇心与求知欲。这种特质并非仅仅源自求生的本能,更体现为一种对未知的自觉认知与主动探索——例如“宇宙如何诞生”这类问题,早已超越了生存需求的范畴。

愿意翻阅这本技术图书,足见你对游戏引擎技术抱有深切的求知渴望。

当收到泽西的邀约时,我深感荣幸,同时也意识到一份沉甸甸的责任:唯有认真通读全书,方能写出中肯诚挚的推荐序,既为读者提供有价值的参考,也尽可能客观地呈现作者倾注的心血。

一款成熟的3D游戏引擎,涉及的技术领域广博而深邃,其复杂程度甚至不亚于一个现代操作系统。要围绕这一主题撰写一本兼具可读性与深度的通俗技术读物,其难度可想而知。

在我看来,本书在游戏引擎知识体系的广度上进行了一次出色的系统性梳理。尤为可贵的是,作者并未止步于泛泛而谈,而是深入探讨了诸多与一线开发实践密切相关的底层原理。

例如,我们或许曾参与过UI的构建。但从引擎的视角来看,这些UI元素是如何被解析与组织的?引擎设计者应如何构建运行架构,确保其高效、准确地渲染呈现?

再如,令人又爱又恨的粒子特效为何常成为性能瓶颈?在绚丽视觉的背后究竟发生了哪些计算过程?引擎采用了哪些优化策略来维持系统的高效率运行?

书中有些内容或许会进一步激发你的思考,引导你展开更深入的研究。比如,游戏引擎处理用户输入时,并非仅依赖操作系统的事件回调机制,还常采用主动轮询的方式。这种设计背后的考量是什么?这种设计思路还可以借鉴到哪些地方?

游戏引擎涵盖的内容实在太多,一本书的篇幅不可能做到面面俱到。我觉得我们可以把这本书当作一座“知识瑰宝的博物馆”。透过它,我们可以了解这一领域的重要课题、典型问题及其解决思路。若它还能引发你的兴趣,促使你关注技术前沿的发展动态,那无疑会让“馆主”(作者)深感欣慰。

对于已在游戏项目中摸爬滚打数年、希望踏上引擎探索之路的开发者,相信本书的很多章节会让你立即感受到获得新知的“快感”——那种理解底层原理后不禁发出“噢,原来如此”的欣喜。诚然,纸上得来终觉浅,要把看懂的内容转化为实际的生产力,我们仍需持续付出努力——在工作之余想方设法抽空学习,在开发过程中落实践行,进而加深理解、拓展求知,如此循环往复。

对于刚踏上游戏开发旅程、在项目里埋头苦干的开发者,建议将此书作为工作之余的拓展读物。如果我们能很好地吸收书中的知识,那自然再好不过;而若遇到一些难以攻克的问题,我们也不必恋战,不必在每个难点上都耗尽心力。我们可以先建立一些基本概念,遇到“硬骨头”先做标记,再择机深入研究。每一次打开引擎编辑器、让游戏运行起来时,哪怕只多熟悉一分背后的技术原理,也会为日常工作增添几分信心。

而对于从业多年的资深工程师与技术专家,我相信本书亦具“温故知新”之效。阅读本书,或可激活你尘封的知识记忆——从计算机体系结构(游戏引擎本质上如同一个专用操作系统)到编译原理、多线程架构、对象管理系统,乃至动态语言的实现细节……皆有触及。

正如曾深度参与微软《光环》《命运》系列引擎开发的王希老师所言:游戏引擎知识体系博大精深,即便放眼全球,能全面掌握各项技术的专家也屈指可数。他还补充道,我们不必急于求成。

在作者序中我们也能看到,泽西个人也经历了从谨慎修改引擎代码,到逐步实现自主产出的成长历程。因此,若某些技术让你感到陌生甚至受挫(比如你日常开发很少接触的技术细节),请不必气馁,更无须自我怀疑。你觉得困难的事情,其他人大概率也会有同样的感受。

身为泽西的同龄人,我对“中年人”时间与精力的宝贵深有体会。作为有两个年幼孩子的父亲,以及一直身处一线的行业中坚力量,泽西通过写书和实践来督促自己持续学习,并愿意花时间认认真真地整理自己的积累,这十分难得。由此可见,他也在不断挑战自我、持续成长。

技术成长之路从来不易,但你并不孤单。愿我们共勉前行。

—— 陆俊壕 广州4399引擎组负责人

作者序

为什么要写这本书

本书的创作源自一段非凡的职业旅程。2019年年末,我有幸踏入“鹅厂”——一家顶尖游戏开发公司,并加入了一个基于端游IP开发的重磅手游项目。此项目聚集了众多技术精英,每个人都怀揣着崇高的期望与梦想。当时我踌躇满志,以为自己的技术很厉害,可以在项目中大显身手。然而,仅半年光景,我便意识到自己的局限,曾引以为傲的技术和经验在这里竟显得平平无奇。同事们对我提出的技术方案及其背后的原理早已了然于心,不仅能轻松指出其中的优缺点、性价比是否合理,还能预判执行过程中可能会遇到的挑战。在日常工作中,同事们总能直击问题核心,从原理出发解决当前项目中的难题,所提出的方案有理有据,执行过程也扎实有效。这让我感到震惊,因为我之前从没有遇到过这样的团队。难道真的是我的技术落后了吗?经过沉思,我不得不承认,在这个高手如云的环境中,我仍是一名“学徒”。但我不愿就此认输,毕竟十余年来,我作为主程参与了众多项目,从游戏技术框架的搭建到架构设计,再到方案的落地实施,积累了丰富的经验,更不用说我还拥有畅销项目的实战经验。那么,问题究竟出在哪里呢?

转折点发生在一次项目讨论会上。当时,有个渲染上的技术难题在业务层面一直很难解决,就在大家思路枯竭的时候,有位同事提出更改引擎的方案。该方案思路清晰,即在引擎渲染管线的执行流程中新增一个接口来专门处理这个特殊的渲染问题。这一提议瞬间打开了大家的思路,原来还可以通过更改引擎中的渲染流程来完成渲染功能的改造。

这件小事触动了我,它像是一只无形的手把我从原来狭隘的编程世界中拽了出来,引领我步入一个更为广阔的引擎与操作系统领域。自那时起,我暗自下定决心,要深入理解引擎中的每一个模块与结构。

我相信,我的这段经历能引起许多读者的共鸣。通过这件事我认识到引擎作为游戏研发基础建设和底层逻辑的重要性。在前10年的职业生涯中,我一直在游戏开发业务层摸爬滚打,熟悉了如何快速搭建游戏业务架构,掌握了游戏各模块的开发制作流程和技术原理,知道了如何在各种变化的需求中使用相应的技术开发出所需的功能,但始终没有向引擎技术迈进一步,这使得游戏引擎技术不仅成为我技术能力的短板,也成为我职业发展的瓶颈。

2021年,我出版了《Unity3D高级编程:主程手记》一书,该书梳理了我过去做过的所有项目模块的技术要点,包括UI框架、寻路算法、网络同步、模型动画等的原理和优化方案(详见博客luzexi.com)。该书出版后,我意识到自己的职业发展瓶颈,于是萌生了一个想法,即在博客上系统性地对游戏引擎进行剖析。我期望通过这一过程,不仅能深化自己对引擎的理解,更能将这份理解分享给更多开发者。剖析的内容包括引擎模块的结构、流程、技术原理及实现方式。我在解析引擎各模块的同时,也把这些原理和技术应用在了项目中,将这些知识与实际工作相结合,使其发挥最大效益。

在接下来的很长时间里,我在游戏项目实践中不断尝试修改引擎。起初我遇到很多困难,由于以前不熟悉引擎源码,我只能小心翼翼地先阅读并理解相关模块的前后源码,再做一些小的接口改造。即便如此,每次提交引擎代码后,我仍时常担心会导致引擎崩溃,总怕我的修改导致游戏战斗运行时出错。随着日子一天天过去,我慢慢地熟悉了整个引擎框架,开始能够对大的模块进行改造,并陆续发现渲染管线中存在的问题和冗余代码,进而对其进行性能优化。

然而,我深知自己对引擎的理解仍不够透彻。为了全盘掌握其内在机制,我决定对每个模块进行系统性的解析。从引擎的基础知识开始,接着是引擎的动画原理、动画框架、粒子框架、UI框架、渲染管线、资产管理、内存管理、虚拟机技术等。而且,我把每个关键的知识点都绘制成图,便于理解和记忆。

后来我的工作方向发生了变化,注意力逐步从游戏开发转为游戏性能优化,内容包括性能分析、资源优化、引擎优化、框架升级改造和性能工具研发等,在此过程中,我更深刻地体会到引擎架构与各模块运作原理对于优化工作的重要性。实际上,“引擎技术”已超越单纯引擎的范畴,但为了方便叙述,我仍统称为“引擎技术”。为了更好地理解引擎,我在本书中尽可能采用图来描述原理、流程及结构,以加速读者的理解进程。

本书之所以命名为“图解游戏引擎”,就是希望通过图示化的方式形象地解读抽象的技术,以便读者系统性地学习。本书内容由浅入深,力求通俗易懂,先介绍引擎各模块的原理及其来龙去脉,再讲解它们在Unity和Unreal引擎中的框架结构、逻辑流程及关键细节,涵盖的模块包括动画、UI、内存、渲染管线、虚拟机技术、粒子系统、资产管理、多线程等。

写作过程亦是我对知识总结与深化理解的过程,希望通过分析与总结,能帮助读者更深入地掌握引擎技术。

感谢读者能看完这篇作者序。我本人看书时最爱看序,序是最能体现作者心境的地方,它是作者心路历程的综合体现,述说了在这个过程中作者思想的变化。在序中,作者可以对自己的经历和体会畅所欲言,这种感觉真是太爽了。

读者对象

本书主要适合以下读者。

对游戏引擎感兴趣,希望快速了解其整体架构与核心概念的初学者。

期望系统掌握游戏引擎知识,并能深入研究特定模块的开发者或进阶学习者。

当前从事游戏开发相关工作的技术人员与设计人员,包括游戏策划、设计师、运维工程师等,涉及的项目涵盖移动游戏、PC游戏和VR游戏等。

高等院校计算机、软件工程、数字媒体、游戏设计等相关专业的学生。

如何阅读本书

本书详细阐述了各个引擎模块的来龙去脉,涵盖历史由来、原理知识、基础结构等方面,内容涉及引擎基础技术、动画、UI、内存管理、渲染管线、虚拟机、粒子系统、多线程等。例如,动画部分会从骨骼的计算原理讲起,逐步深入介绍 Unity 中的实现方式;渲染管线部分会从软件渲染讲到硬件管线,并追溯 GPU 的发展历史,帮助读者了解渲染管线的来龙去脉,将相关知识串联起来。

本书旨在为读者提供一条通俗易懂的引擎知识学习路径,助力读者快速高效地掌握引擎各模块的知识要点,熟悉其关键点与整体架构。全书共使用 270 余张图来描述引擎各模块的关键点、结构和流程,以提升读者阅读理解的效率和效果。

勘误和支持

由于我的水平有限,书中难免存在一些不准确之处,恳请读者批评指正。我在国内的Git仓库中开设了问题集记录页面(https://gitee.com/luzexi/Illustrated-Game-Engine),如果读者发现书中的错误,可以将其发布到相应的问题列表中,我将及时反馈。本书内容基于我的个人博客整理而成,在博客中此系列还会持续更新。本书涉及的参考资料也已发布到博客上。读者还可以加入QQ群(777859752)来一起探讨游戏技术。如果读者有更多的宝贵意见,也欢迎发送邮件至我的邮箱jesse_luzexi@163.com,我非常期待听到读者的真挚反馈。

致谢

感谢朋友们、同事们及广大网友的支持与鼓励。特别感谢人民邮电出版社优秀的编辑杨绣国,与她合作很愉快。编写书稿历时三年半,时光漫长却又转瞬即逝,在这段时间里,我深刻体会到任何困难在时间的长河中都会变得不再那么艰难。

特别感谢我的妻子余胜男,她是全天下最温柔智慧的女人,我们不仅是夫妻,还是很好的合作伙伴。为了让我顺利完成书稿,她默默为我营造工作环境,是我无形中的心理医生。她时常安抚我的情绪,在我最低谷、最难过的时候陪伴在身边为我分忧解难。此外,还要感谢我的两个女儿陆秀恩和陆安妮,我因为长期在外地工作,很少有时间陪伴她们。我能做的是每个月都写一封信跟她们聊聊最近发生在自己身边的故事。她们很喜欢这种交流方式,也会向我讲述她们的故事。这不仅减缓了分离带来的焦虑,还在不经意间梳理了我们彼此的学习和工作脉络,太棒了。我发现她们的所思所想和我当年如出一辙,那些看似不经意的交流解开了我对人生的疑惑,让我对未来的道路更加坚定。她们经常鼓励我:“爸爸加油!”能和孩子们一起努力使我很开心,人生的道路上又多了两位知己。

陆泽西

第1章
游戏引擎概述

当今市面上有许多游戏引擎,每种游戏引擎都有自己的特色。Unreal Engine(后文简称Unreal)以其强大的编辑器功能和渲染能力著称,Unity具备易于上手和轻松跨平台的特点,寒霜引擎(Frostbite Engine)则具有强大的艺术资源制作能力,等等。那么游戏引擎到底是什么?它的起源与发展历程是怎样的?它由哪些模块构成?一个最简单的游戏引擎程序结构又是怎样的?本章旨在帮助大家对游戏引擎有个初步的了解。本章内容主要分为3个部分:首先梳理从没有游戏引擎概念到游戏引擎概念形成,再到游戏引擎作为商业化产品被广泛应用的发展过程;其次介绍游戏引擎的模块结构和它们所发挥的作用;最后介绍游戏引擎的整体架构,让大家能直观地认识到游戏引擎其实是一个基于简单无限循环机制的程序系统。

1.1 游戏引擎的发展史

20世纪80年代到90年代初,游戏引擎的概念尚未完全形成,游戏开发者通常会针对特定游戏设备或游戏平台编写专用的游戏代码。随着个人计算机和家用电子游戏机的普及,游戏开发逐渐从单一平台向多平台扩展,游戏引擎的概念也逐渐形成。在这一过程中,id Software 公司开发的《德军总部 3D》(Wolfenstein 3D)和Doom等游戏对游戏引擎技术的发展产生了重要影响。

1992年,美国Apogee Software公司发行了《德军总部 3D》这款射击游戏,如图1.1所示。尽管该游戏的容量约为2MB,但它在整个游戏发展史上占据重要地位。稍有资历的玩家可能都还记得自己初次接触它时的兴奋心情,这款游戏被广泛认为是奠定了第一人称射击游戏基础框架的重要作品。更重要的是,它在由x轴(宽度)和y轴(高度)构成的图像平面上增加了一个代表前后纵深的z轴,这个z轴的引入标志着3D游戏时代的来临。

图1.1 《德军总部3D》游戏界面

随着《德军总部 3D》游戏的大获成功,id Software公司于1993年发布了自主研发的第二款3D游戏——Doom,如图1.2所示。Doom游戏引擎(后文简称Doom引擎)在技术上远超《德军总部 3D》的游戏引擎。在《德军总部 3D》中,所有物体的大小都是固定的,路径之间的角度也都是直角,因此玩家只能笔直地前进或后退。这些限制在Doom游戏中都得到了改进。尽管游戏的关卡依然基于二维平面构建,尚未引入“楼上楼”的立体概念,但墙壁的厚度和路径之间的角度已经呈现出多样化,这使得楼梯、升降平台、塔楼和户外等各种复杂场景的实现成为可能。

图1.2 Doom游戏界面

值得一提的是,Doom引擎是早期成功实现商业授权的游戏引擎。1993年年底,Raven公司采用改进后的Doom引擎开发了一款名为《投影者》(ShadowCaster)的游戏,这一举措堪称游戏史上具有重要影响力的“引擎嫁接手术”。1994年,Raven公司又采用Doom引擎开发了一款名为《异教徒》(Heretic)的游戏,并引入了飞行特性,这一特性后来成为跳跃动作的前身。1995年,Raven公司再次采用Doom引擎开发了一款名为《毁灭巫师》(Hexen)的游戏,其中加入了新的音效技术、脚本技术,并采用了类似集线器的关卡设计,允许玩家在不同关卡之间自由穿梭。Raven公司与id Software公司之间的一系列合作充分表明游戏引擎的授权对使用者和开发者均大有裨益,只有将游戏引擎开放给更多人使用,才能使其不断地成熟和发展。

1994年,3D Realms公司完成Build的研发。该游戏引擎因成功应用于广受欢迎的游戏《毁灭公爵 3D》(Duke Nukem 3D而受到关注。通过Build的授权业务,3D Realms公司获得了100多万美元的额外收入,成为最早从游戏引擎授权中获益的公司之一。

20世纪90年代中期到21世纪初,标志着3D游戏引擎时代的到来。随着计算机图形学的发展,游戏引擎开始支持三维图形渲染。著名的三维游戏引擎包括id Software公司的Quake、Epic Games公司的Unreal及Crytek公司的CryEngine。这些游戏引擎大大提高了游戏的视觉效果,推动了游戏产业的发展。

随着时代的发展,游戏公司对游戏引擎的重视程度日益提高。Quake系列游戏是3D游戏史上的经典之作,其创造者——id Software公司的游戏编程大师约翰·卡马克对游戏引擎技术的发展做出了卓越的贡献。从1996年Quake问世到1997年的Quake Ⅱ,再到1999年风靡全球的Quake Ⅲ: Arena,每一次版本迭代都把游戏引擎技术推向新的高度。在Quake Ⅲ: Arena发布之后,约翰·卡马克逐步公开了Quake的游戏引擎(后文简称Quake引擎)源代码,将自己的技术成果无偿分享给了全世界。虽然现在Quake引擎已经逐渐淡出主流视野,但仍被无数程序员 奉为经典,约翰·卡马克的引擎源代码对他们的学习和成长具有极其重要的意义。

1997年,id Software公司推出游戏Quake Ⅱ后,一举确立了自己在3D引擎市场上的霸主地位。Quake Ⅱ采用了一套新的引擎(后文简称Quake Ⅱ引擎),可以更充分地利用3D加速和OpenGL技术,与Quake引擎相比,它在图像和网络性能方面有了质的飞跃,如图1.3所示。Quake Ⅱ引擎是当时少有的全面支持多边形模型、动画和粒子特效的3D引擎,与仅能提供2.5D体验的Doom引擎、Build引擎形成鲜明对比。Raven公司的《异教徒2》和《军事冒险家》、Ritual公司的《原罪》、Xatrix娱乐公司的《首脑:犯罪生涯》,以及离子风暴工作室的《安纳克朗诺克斯》,都采用了QuakeⅡ引擎。

图1.3 QuakeⅡ游戏界面

Quake Ⅱ还在独霸市场的时候,一家后起之秀——Epic Games公司基于Unreal引擎推出了游戏《虚幻》,尽管当时这款游戏只是在320×200(像素)的分辨率下运行,但游戏中的许多特效即便在今天看来依然很出色。

在Unreal引擎推出后的两年内,已有18款游戏获得了Unreal引擎的授权,这还不包括Epic Games公司发布的《虚幻》的资料片《重返纳帕利》、Human Head Studios开发的第三人称动作游戏《北欧神符》(Rune),以及Ion Storm开发的角色扮演游戏《杀出重围》(Deus Ex)系列的前两部。Unreal引擎的应用范围不限于游戏开发,还延伸至教育、建筑等其他领域。例如,Digital Design公司曾与联合国教科文组织的世界文化遗产部门合作,采用Unreal引擎开发了巴黎圣母院的内部虚拟演示系统;ZenTao公司采用Unreal引擎为空手道选手打造了武术训练软件;软件开发商Vito Miliano公司采用Unreal引擎开发了一款名为Unrealty的建筑设计软件,用于房地产项目的演示。如今,Unreal引擎已经从激烈的竞争中脱颖而出,成为当下主流的次世代游戏引擎之一。

1998年,两部划时代的游戏作品同年问世——Valve公司的《半条命》(Half-Life)和Looking Glass工作室的《神偷:暗黑计划》(Thief: The Dark Project)。尽管此前也有很多游戏为引擎技术引入新特性,但没有哪款游戏能像《半条命》和《神偷:暗黑计划》那样,对后续游戏作品及引擎技术的发展产生如此深远的影响。

于1998年发布并获得众多大奖的游戏《半条命》(如图1.4所示)采用了基于Quake Ⅱ引擎深度定制开发的新引擎。Valve公司在此基础上实现了两项关键创新:一是引入脚本序列技术,这一技术使得游戏可以通过触动事件来增强玩家在故事情节方面的真实体验,这对于历来就很少关注情节的第一人称射击游戏来说无疑是一次伟大的革新;二是对AI(人工智能)引擎的改进,敌人的行动与以往相比更为复杂和智能化,他们不再是单纯地扑向枪口。这两项创新赋予了《半条命》游戏引擎鲜明的个性魅力。基于此引擎开发的《军团要塞》(Team Fortress)、《反恐精英》和《毁灭之日》等优秀作品重构并优化了网络通信架构,这一举措令《半条命》游戏引擎在游戏领域大放异彩。

图1.4 《半条命》游戏界面

同年,Looking Glass工作室发布了游戏《神偷:暗黑计划》,该游戏采用工作室自主研发的Dark引擎,该引擎在游戏人工智能系统方面贡献颇丰。Dark引擎虽然在图像表现方面稍显逊色,但它在敌人系统设计方面却相当先进:能够根据声音辨认玩家的方位,能够分辨出脚踩在不同地面上的声响,能根据不同的光照调整判断,发现同伴的尸体后会进入警戒状态,还会针对玩家的行动做出各种合理的反应,玩家需要巧妙地躲在暗处,才有可能不被敌人发现并完成任务。

进入2000年后,3D游戏引擎朝着两个不同的方向发展:一是融入更多叙事元素、角色扮演成分,并加入人工智能来提升游戏体验,例如《反恐精英》《神偷2:金属时代》《杀出重围:虚幻之战》等游戏;二是朝着纯粹的网络模式发展,比如,id Software公司在游戏Quake Ⅱ出色的图像引擎基础上加入了更多的联网功能,推出了一款完全没有单人过关模式的在线游戏Quake Ⅲ: Arena。该游戏所用引擎与Epic Games公司后来推出的《虚幻竞技场》(Unreal Tournament)所用引擎一同成为游戏引擎发展史的重要转折点。《虚幻竞技场》游戏界面如图1.5所示。Quake引擎是多人连线游戏的开创者之一,尽管几年前的游戏Doom也能通过调制解调器进行连线对战,但最终把网络游戏带入大众视野的是Quake系列引擎,特别是Quake Ⅲ引擎,它也促成了世界电子竞技产业的发展。

图1.5 《虚幻竞技场》游戏界面

另外,在1998年到2007年期间,游戏引擎领域出现了两匹“黑马”:LithTech和CryEngine。

LithTech引擎由Monolith Productions公司研发,最初应用于机甲射击游戏《升刚》(Shogo)中。该引擎的开发耗时长达5年,耗资700万美元。1998年,LithTech引擎的第一个版本一经推出,便立即引起了业界的关注,为当时由Quake Ⅱ引擎与Unreal引擎主导的竞争格局注入了新的活力。采用第一代LithTech引擎制作的游戏包括《血兆2》(blood The Chosen)和《升刚:机动装甲师》等。2001年和2003年,LithTech 引擎相继推出了2.2版本和2.4版本,这两个版本分别加入了媒体流和网络同步技术。游戏《无人永生》(No One Lives Forever)和《全球行动》(Global Operations)分别采用了LithTech 2.2和LithTech 2.4引擎。此时的LithTech已经从一款有益的补充引擎成长为能够与Quake Arena和《虚幻竞技场》的引擎相媲美的引擎。曾有业内人士评价,采用LithTech引擎开发的游戏,无一例外都是3D类游戏的顶尖之作。

CryEngine引擎由Crytek Studios公司研发, 它在绘图、物理和动画技术,以及游戏场景相关方面进行了诸多加强。这些强化内容包括体积云、即时动态光影、场景光线吸收、3D海洋技术、场景深度处理、物体真实动态半影效果、逼真的脸部动画、半透明物体的光线散射、可破坏的建筑物和树木等。进阶的物理效果让树木能够对风、雨和玩家的动作做出更真实的反应。此外,该引擎还包括进阶的粒子系统,例如火和雨会受到外力作用而改变方向,光芒特效可以产生水底的折射效果等。在基于CryEngine引擎研发的《孤岛危机》(Crysis)游戏中,强大的物理模拟效果和自然景观呈现技术足以与当时最优秀的游戏引擎相媲美,如图1.6所示。

图1.6 《孤岛危机》游戏界面

21世纪初至今,游戏引擎逐渐朝着高度集成化和跨平台的方向发展。在这个阶段,游戏引擎逐渐演变成高度集成化的开发工具,支持跨平台开发,包括PC、游戏机、移动设备等多种平台。其中,Unity和Unreal是具有代表性的游戏引擎。这些引擎不仅提供了丰富的图形渲染功能,还整合了物理引擎、音频处理、网络通信、UI设计等多方面的功能,大大降低了游戏开发的门槛。

Unity是当前最受欢迎的游戏引擎之一,其在移动游戏和独立游戏领域有着广泛的应用。Unity支持多平台(包括PC、游戏主机、移动设备等)开发,它拥有易用的开发环境、丰富的资源库及强大的社区支持,可助力开发者快速上手并完成游戏开发。

2005年6月,1.0版本的Unity发布,如图1.7所示。它最初于2005年在苹果公司全球开发者大会上公布并开放使用,初期仅面向Mac OS X平台。凭借其易用性,它迅速获得了广大开发者的喜爱。之后,Unity公司便开启了快速迭代升级之路,仅用了不到10年时间就从1.0版本一路升级到了5.0版本。鉴于引擎更新速度逐渐加快,Unity官方决定不再在其版本号中单纯使用数字标注,而是改用年份与版本号的复合形式,如Unity 2018.2——版本发布时间为2018年7月10日。截至目前,使用Unity开发的手机游戏,无论是在数量上还是在流行度上,都位居所有引擎之首,深受玩家喜爱。

图1.7 Unity界面

Unreal也是当前深受欢迎的游戏引擎之一,常用于AAA级游戏开发,如图1.8所示。它以出色的图形渲染能力和卓越的实时性能而闻名,同时也支持跨平台开发。Unreal的蓝图可视化编程系统让那些没有编程基础的开发者也能够参与游戏设计。自Unreal崭露头角以来,便踏上了不断升级的征程,从Unreal 1发展到Unreal 5,该引擎凭借优秀的画质表现、适中的显卡要求、强大的自定义工具和一站式配套开发环境,满足各个平台上各类游戏开发的需求,因此,越来越多的游戏项目选择采用Unreal开发。

图1.8 Unreal界面

近年来,Unity和Unreal的霸主地位之争越来越趋于白热化,很多开发者(甚至大公司的工作室团队)在Unity和Unreal之间反复权衡,两家公司也在各自的优势路线上不断推陈出新。同时,大公司越来越倾向于自研引擎,意在为公司的游戏开发打造更优质的研发管线,提供更强大的引擎支持。许多大型游戏公司会选择自研引擎(如EA的Frostbite引擎、Ubisoft的Anvil引擎、网易的NeoX引擎和Messiah引擎、腾讯的CROS引擎和GiiNEX游戏AI引擎等)进行游戏开发。自研引擎可以根据公司的特定需求进行定制,从而更好地优化游戏性能,实现独特的游戏效果。然而,自研引擎的开发和维护成本较高,一般只有大型游戏公司才有足够的资源进行相应的研发和维护。

除以上引擎外,还有如下一些引擎。

Source引擎:由Valve开发,随2004年《半条命2》首次亮相,其图形渲染能力和工具套件可与Unreal引擎媲美。

寒霜引擎:由EA DICE开发,首用于2008年《战地:叛逆连队》,之后成为艺电(EA)广泛应用的引擎。寒霜引擎拥有强大的统一资产创作工具FrostEd,以及强大的后端服务工具管线。

PhyreEngine引擎:索尼推出的引擎,专为支持索尼的PS2、PS3、PS4等平台提供技术服务。主要用于PS3、PS4和PS Vita平台,帮助第三方开发者高效利用主机硬件特性,尤其在PS3的Cell处理器优化方面发挥了重要作用。

XNA Game Studio引擎:微软推出的基于C#语言的引擎,使用Visual Studio管理游戏项目资产。

随着云计算技术的蓬勃发展,云游戏逐渐成为游戏产业的新趋势。云游戏引擎可以让游戏在云端运行,用户无需高性能硬件即可获得高质量的游戏体验。

1.2 引擎的模块结构

游戏引擎由很多模块组成,通常包括基础组件、输入设备模块、渲染管线、渲染硬件接口模块、动画模块、物理引擎、粒子系统、UI模块、资源管理模块、音频模块、AI模块、脚本模块和网络模块等。以下是游戏引擎各模块的详细功能介绍及示例。

1)基础组件:引擎的基础代码模块,包括线程管理机制、委托机制、智能指针工具、常用数学库、容器库、算法库、反射机制、宏定义与模板工具、离线代码生成器及文件I/O库等。

2)输入设备模块:负责处理来自键盘、鼠标、触摸屏、游戏手柄等输入设备的数据。例如,在射击游戏中,输入设备模块会响应玩家按下扳机键的动作,从而触发角色发射子弹。

3)渲染管线:这是处理游戏中图形渲染的核心部分,包括几何处理、光照计算、阴影绘制、纹理贴图及后处理效果等。

4)渲染硬件接口模块:负责封装底层图形API(如OpenGL、DirectX、Vulkan等)的调用,并提供统一接口,方便引擎在不同平台上执行渲染操作。例如,在赛车游戏中,该模块可根据平台硬件性能优化配置,如果底层支持,可实现高质量的光线追踪效果。

5)动画模块:负责处理游戏角色和物体的动画效果,包括骨骼动画、顶点动画、精灵动画等。例如,在动作游戏中,动画模块确保主角攻击动作的流畅性与逼真度。

6)物理引擎:模拟现实世界的物理现象(包括碰撞检测、刚体动力学、布料模拟、流体模拟等),并将其应用到游戏世界中。例如,在足球游戏中,物理引擎负责计算球员与足球的碰撞,以及足球在空中的运动轨迹。

7)粒子系统:负责生成与控制大规模粒子效果,用于模拟自然现象或特殊视觉效果(如火焰、烟雾、雨滴等)。例如,在一款魔法类游戏中,粒子系统可以用来生成施展法术时的特效。

8)UI模块:负责游戏用户界面的设计和显示,包括按钮、文本、图像等用户界面元素的布局和渲染。例如,在策略游戏中,UI模块会负责显示玩家的资源、建筑菜单等信息。

9)资源管理模块:负责游戏资源(如模型、纹理、声音等)的加载、卸载和内存管理。例如,在角色扮演游戏中,资源管理模块会在需要时加载新场景资源,并在不再需要时卸载旧场景资源。

10)音频模块:处理游戏中的声音效果,包括背景音乐、音效、语音等。例如,在恐怖游戏中,音频模块会根据游戏情境播放紧张的背景音乐和突发的恐怖音效。

11)AI模块:控制游戏中非玩家角色(NPC)的行为,包括决策制定、路径规划和设置反应机制等。例如,在即时战略游戏中,AI模块可以让敌人根据玩家的行动选择最佳进攻或防御策略,提升游戏的挑战性与趣味性。

12)脚本模块:为开发者提供编写游戏逻辑的接口,通常使用脚本语言如Lua、Python等,便于快速迭代和调试,减少重新编译的时间,提升开发效率。例如,在动作游戏中,脚本模块可以控制特定事件触发后的角色动画与音效,使游戏行为更加灵活。

13)网络模块:负责处理游戏中的网络通信,如客户端与服务器之间的数据传输、多人游戏同步等。例如,在多人竞技类游戏中,网络模块可同步玩家的位置、动作和攻击信息,确保公平的游戏体验。

这些模块共同构成了游戏引擎的基本框架,使得游戏开发者能够在此基础上快速构建出各种类型的游戏。游戏引擎模块如图1.9所示。

图1.9 游戏引擎模块

游戏引擎通常由工具套件和运行时组件两部分组成,这里主要介绍运行时组件。与所有软件系统一样,游戏引擎是由多个软件层构建的,通常采用“上层依赖下层,下层不依赖上层”的分层设计结构。每层中各模块尽量保持独立,避免相互依赖,以实现低耦合、高重用的架构。这种设计理念在大型软件系统架构中非常关键。

1.3 引擎的整体架构

游戏引擎的整体架构(运行时架构)可分为13个抽象层,每层都只依赖其下层。这13个抽象层依次为:目标硬件层、设备驱动层、操作系统层、平台抽象层、第三方中间件层、核心库层、资源管理层、渲染硬件接口层、引擎核心层、逻辑基础层、游戏框架层、游戏逻辑层,如图1.10所示。

图1.10 游戏引擎架构

每个层级的拆解理念解释如下。

1)目标硬件层:直接与物理硬件设备交互的层级,包括游戏运行的硬件设备,如PC、游戏主机、移动设备等。PlayStation 5、Xbox Series X 和 iPhone 12都属于目标硬件层。

2)设备驱动层:由操作系统或硬件商提供的最底层软件组件,负责管理硬件资源,并在操作系统与硬件设备之间提供接口隔离。它支持上层引擎访问硬件资源,包括显卡驱动、声卡驱动等。例如,NVIDIA 和 AMD 分别为显卡提供驱动程序,以确保其与不同操作系统兼容。

3)操作系统层:包含游戏运行所需的操作系统,如Windows、macOS、Linux、Android、iOS等。该层需要适配不同的操作系统API接口和调用流程。例如,在PC上,游戏引擎需要适配Windows 10操作系统;在手机上,需要适配Android或iOS操作系统。

4)平台抽象层:对常用的库和操作系统接口进行抽象,提供统一的跨平台接口,使游戏引擎能够在多个平台上运行。例如,游戏引擎可能提供一个通用的文件读写接口,以便在Windows、macOS和Linux上使用相同的代码逻辑。

5)第三方中间件层:集成与游戏引擎协同工作的第三方软件库,提供独立的解决方案以简化开发流程,缩短开发周期。常见的中间件包括物理引擎和音频处理库等。例如,许多游戏引擎会集成Havok物理引擎用于物理模拟,或者集成FMOD音频库以处理游戏音效。

6)核心库层:包含基础的软件工具库和常用的数据结构,提供频繁使用的核心功能(如内存管理、数学计算、字符串处理等)。其为上层引擎模块提供高效、稳定的支持,确保引擎在不同模块之间的功能一致。此外,该层还定义了引擎的基础数据结构(如场景图、实体组件系统等)。例如,Unity 中的 GameObject及其组件系统。

7)资源管理层:负责游戏资源(如模型、纹理、声音等)的加载、释放和内存管理,提供对资源增删改查的完整解决方案。

8)渲染硬件接口层:封装图形API(如OpenGL、DirectX、Vulkan等)并提供统一的渲染接口,实现硬件加速的图形渲染。例如,游戏引擎可以通过DirectX或OpenGL与显卡进行通信,以实现高效的3D图形渲染。

9)引擎核心层:提供最核心的功能模块,包括渲染管线、动画系统、物理引擎、粒子系统、UI系统、后处理系统等,为游戏运行提供基础支撑。这些核心模块可进一步扩展为性能剖析工具、地形编辑器等实用工具,并通过可视化编辑器帮助开发者高效构建游戏场景与编写逻辑。例如,在一款赛车游戏中,引擎核心层负责渲染赛车、道路、环境等元素,并添加光照、阴影等视觉效果。同时,引擎基于核心模块集成了可视化场景编辑器,开发者可通过拖曳操作创建和编辑游戏场景。

10)逻辑基础层:为搭建游戏框架提供基础组件,实现通用的基础功能,包括网络通信、数据存储、支付等。例如,在一款在线多人游戏中,逻辑基础层负责处理玩家之间的数据同步和通信。

11)游戏框架层:提供游戏开发的基本框架,如游戏循环、状态机、事件系统等。例如,游戏中的主菜单、关卡选择、暂停菜单等功能就由该层管理。

12)游戏逻辑层:实现具体的游戏逻辑和内容,包括角色、关卡、剧情等。例如,在一款冒险游戏中,游戏逻辑层负责实现角色控制、关卡设计和故事剧情。

游戏引擎要在屏幕上生成快速连续的图像,需要一个持续运行的循环机制,在引擎中这一机制称为应用循环。应用循环包括交互更新、视锥剔除计算、物体信息更新、动画更新、逻辑更新、场景更新、粒子更新、UI更新、渲染提交等。

最简单的应用循环结构代码如下。

void main() {
      while (!quit) {
          // 更新交互设备输入信息
          updateInput();
          // 根据功能模块的计算更新动态元素的位置、方向
          updateWorld();
          // 视锥剔除计算
          cameraCull();
          // 调用图形API将对象网格、材质渲染到离屏帧缓冲区(后台缓冲区)
          renderObject();
          // 将后台缓冲区与前台缓冲区交换,使渲染的图像在屏幕上可见
          swapBuffers();
      }
}

应用循环的具体步骤如下。

1)交互设备输入处理:负责更新输入设备(如键盘、鼠标、手柄等)的状态,并将输入事件传递给游戏和UI系统。

2)更新世界:执行物理模拟、业务逻辑、动画更新、AI计算等引擎模块,以更新当前帧中物体的状态。

3)视锥剔除计算:根据摄像机视锥体范围计算需要渲染的对象,将视锥体范围外的对象从渲染队列中剔除。

4)渲染管线:根据剔除结果将需要渲染的对象送入渲染管线。由于渲染时需要呈现不同的效果,因此会让不同种类的子管线组合起来协同工作,这些子管线包括不透明和透明物体渲染管线、延迟渲染管线、实时阴影生成管线、后处理管线、体积云渲染管线等。

5)缓冲区交换:将渲染的图像映射到屏幕,此过程会调用OpenGL的eglSwapBuffers或者Metal中MTLCommandBuffer的presentDrawable,以将后台缓冲区的内容显示到屏幕上。完成交换后,前台缓冲区则成为新的后台缓冲区,等待下一帧的渲染。

除了前面提到的模块,在实际游戏引擎中还有许多其他模块在应用循环中运行,包括操作系统事件处理、异步资源加载、物理模拟、动画更新、AI计算、UI渲染、音频更新、多线程渲染、垃圾回收、网络状态更新、性能统计等。

不同平台上需要实现的循环函数大同小异,差异主要体现在对操作系统消息的处理机制上。例如,在Windows平台上,主循环中要用PeekMessage、TranslateMessage、DispatchMessage三个Windows函数来获得和处理窗口消息。这些消息包括用户输入(如鼠标、键盘事件)、窗口大小调整、系统命令等。但在其他平台(如Linux或macOS)上就要去掉 Windows相应的消息循环逻辑。

来看一个具体的例子:Quake Ⅱ引擎中的主循环可分为两部分,前半部分用于初始化,包括终端窗口初始化、配置和GM指令初始化,这样开发者可以通过终端窗口输入指令来调试游戏逻辑,玩家也可以通过终端窗口输入秘籍来获得“宝物”。后半部分是while循环,在每次循环中,首先提取并处理Windows消息泵,然后测量实际时间增量,并根据时间间隔执行游戏逻辑更新,最后执行当前帧的游戏逻辑,包括终端输入指令的处理、执行客户端当前帧的逻辑和网络通信逻辑。

Quake Ⅱ引擎主循环代码如下。

int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        0                  LPSTR lpCmdLine, int nCmdShow)
{
      MSG msg;
      int    time, oldtime, newtime; 
 
      // 初始化终端输入、输出窗口
      Sys_CreateConsole();
      // 解析启动指令
      ParseCommandLine (lpCmdLine); 
      // 初始化配置和GM指令
      Qcommon_Init (argc, argv); 
      oldtime = Sys_Milliseconds (); 
      // 主循环
      while (1) {
          // Windows消息泵
          while (PeekMessage (&msg, NULL, 0, 0,
                            PM_NOREMOVE))
          {
              if (!GetMessage (&msg, NULL, 0, 0))
                  Com_Quit ();
              sys_msg_time = msg.time;
              TranslateMessage (&msg);
              DispatchMessage (&msg);
          }
 
          // 测量以毫秒为单位的实际增量时间
          do
          {
              newtime = Sys_Milliseconds ();
              time = newtime - oldtime;
          } while (time < 1);
 
          // 执行当前帧的逻辑
          Qcommon_Frame (time);
 
          oldtime = newtime;
      }
      return TRUE;
}
void Qcommon_Frame (int msec) {
      ...
      do
      {
          // 获取终端窗口输入的字符串
          s = Sys_ConsoleInput ();
          if (s)
              Cbuf_AddText (va("%s\n",s));
      } while (s);
      // 执行终端窗口输入的字符串指令
      Cbuf_Execute ();
      ...
      // 执行网络数据逻辑
      SV_Frame (msec);
      // 执行客户端逻辑
      CL_Frame (msec);
      ...
}

游戏引擎从无到有,经历了技术的长期沉淀过程,逐渐从个体公司的工具发展为了行业通用的商品。各大游戏公司普遍采用已有的引擎进行开发,加速了游戏行业的技术迭代。

相关图书

Python编程快速上手——让烦琐工作自动化(第3版)
Python编程快速上手——让烦琐工作自动化(第3版)
精通MCP:AI智能体开发实战
精通MCP:AI智能体开发实战
DeepSeek原理与项目实战大模型部署、微调与应用开发
DeepSeek原理与项目实战大模型部署、微调与应用开发
人人都是AI程序员:TRAE+Cursor 从0到1全栈实战
人人都是AI程序员:TRAE+Cursor 从0到1全栈实战
驾驭 Gemini 3与Nano Banana:人人都是AI产品创客
驾驭 Gemini 3与Nano Banana:人人都是AI产品创客
C++程序设计语言(第4版)(上、下册)
C++程序设计语言(第4版)(上、下册)

相关文章

相关课程