引用:http://m.biancheng.net/game_engine/
主要讲游戏引擎:
什么是游戏引擎?其实这很难给出明确的定义。
在很多游戏的宣传中,我们会听到对游戏引擎的推崇。绚丽的特效,流畅的体验,似乎都是游戏引擎的功劳。在游戏玩家看来,游戏画面的表现力越好,游戏场面的震撼程度越大,游戏体验的真实感越强,底层的游戏引擎就可能越强大。
根据上述定义,在很多人看来,游戏引擎负责把很多已有的零部件组装起来,如同组装手机,CPU、屏幕、摄像头、主板等都是别人生产的,手机厂商按照自己喜欢样式组装一下就好了。
发动机的性能也决定了汽车的性能,围绕发动机引擎可以制造出多款不同型号的汽车。
3D 游戏引擎的原理与汽车发动机引擎的原理是类似的,游戏的逻辑模块也是在游戏引擎的基础上实现的,游戏开发者只要调用引擎提供的接口编写逻辑。
用同一款引擎可以做出许许多多款游戏,最直观的就是商业引擎,比如 Unity 和虚幻引擎,使用它们研发的产品种类非常多。
十多年前,笔者刚踏入游戏公司做研发时,公司当时并没有 3D 游戏引擎,公司研发游戏都是在上款己研发好的产品基础上进行修改的,换句话说就是“换皮”。
做的时间久了会遇到相同的代码逻辑在不同的游戏项目里面重复出现的现象,行业里面俗称“重复的造轮子”,开发者在开发产品时通常的做法就是复制粘贴,导致项目出现 Bug 的概率非常高,大大降低了研发效率。
为了改变这种现状,公司安排专人尝试着把游戏里面常用的代码抽离出来,重新做一个新工程编译成静态库 LIB 或动态库 DLL,这样 3D 引擎的雏形开始形成了。随着工程的代码量不断增加完善,久而久之,3D 游戏引擎就形成了。
开发 3D 游戏引擎目的是简化游戏制作的复杂度,缩短游戏开发周期,降低产品制作成本,因为封装好的引擎可开发多种类型的产品。
数千年以来,艺术家们通过文学、绘画、雕塑、建筑、音乐、舞蹈、戏剧等传统艺术形式充实人类的精神层面。自 20 世纪中叶,计算机的普及派生出另一种艺术形式——电子游戏。
游戏结合了上述传统艺术以及近代科技派生的其他艺术(如摄影、电影、动画),并且完全脱离了艺术欣赏这种单向传递的方式——游戏必然是互动的,“玩家”并不是“读者”、 “观众”或“听众”,而是进入游戏世界、感知并对世界做出反应的参与者。
精彩的艺术都会令人上瘾,就如同追一部剧追到一半不看会抓狂一样。也正因如此,游戏的精彩程度加上互动的形式,能够带来一种成就感,所以更令人上瘾。
基于游戏的互动本质,游戏的制作通常比其他大众艺术复杂。如同拍一部电视剧、一部电影一样,需要服化道、导演、演员、编剧等等各种人员的共同协同努力。商业游戏的制作通常也是需要各种人才的参与,而他们则需要依赖各种工具及科技。游戏引擎便是专门为游戏而设计的工具及科技集成。
之所以称为引擎,如同交通工具中的发动机,提供了最核心的技术部分。因为复杂,研发成本高,人们不希望制作每款游戏(或车款)时都重新设计引擎,重用性是游戏引擎的一个重要设计目标。
然而,各游戏本身的性质以及平台的差异,使研发完全通用的游戏引擎变得极困难,甚至不可能。
市面上出售的游戏引擎,有一些虽然已经达到很高的技术水平,但在商业应用中,很多时候还是需要因应个别游戏项目对引擎改造、整合、扩展及优化。因此,即使能使用市面上最好的商用引擎或自研引擎,我们仍需要理解当中的架构、各种机制和技术,并且分析及解决在制作中遇到的问题。
既然要开始游戏编程,首先要选择语言工具,C和C++是开发游戏引擎的首选。
游戏编程广义上讲可以分成游戏逻辑编程和游戏引擎编程。然而,它们两者之间的边界往往又没有那么泾渭分明。
游戏逻辑开发是指集中力量开发游戏中的剧情和玩法,要决定的是什么时候显示什么内容,什么时候播放什么声音,什么时候通过网络传输什么数据,什么时候这个物体或者人物做某个动作。至于图像如何显示,声音如何处理,数据如何传输,物体动作如何实现,游戏逻辑开发者其实并不用关心,这些归游戏引擎来处理。
所以说游戏逻辑负责游戏核心玩法方面的内容,游戏引擎负责底层方面的处理。
有人可能会有疑问:“既然你解释了做什么和怎么做,那么可不可以理解为,我想开发一个已经写好了剧本的游戏,既然内容确定了,游戏引擎就应该能给我马上做出来,至于怎么做,我可以不关心吗?”是的,没错,只要你选择的游戏引擎足够强大。
成功的游戏是以好的游戏逻辑为基础的,虽然引擎并不是一款游戏成败与否的决定性因素,但好的游戏内容通过好的游戏引擎来实现,会给人一种全新的视觉和听觉感受,会更加震撼人心,这就好比传统的2D电影与3D乃至4D电影的效果对比。
游戏逻辑就像电影的剧本,至于能否拍摄出预期的效果,不但取决于导演对剧本的理解和演员的演绎,还取决于拍摄的技术和后期的特效处理。
在开始钻研游戏引擎之前,先简单介绍一下典型游戏团队的人员配置。
游戏工作室(game studio)通常由 5 个基本专业领域的人员构成,包括工程师(engineer)、艺术家 (artist)、游戏设计师(game designer)、制作人(producer)及其他管理/支持人员(市场策划、法律、信息科技/技术支持、行政等)。每个专业领域可细分为多个分支,以下逐一介绍。
工程师设计并实现软件,使游戏及工具得以运行。
有时候,工程师分为两类:运行时程序员(runtime programmer)和工具程序员(tool programmer)。运行时程序员制作引擎和游戏本身;工具程序员制作离线工具,供整个团队使用,以提高团队的工作效率。
运行时/工具两方面的工程师都各有专长:
有些工程师在职业生涯里专注单一的引擎系统,诸如渲染、人工智能、音效或碰撞/物理;
有些工程师专注于可玩性(gameplay)和脚本编程(scripting);
也有一些工程师喜欢系统层面的开发,而不太关心游戏实际上怎么玩;
还有些工程师是通才(generalist),博学多才,能应付开发中不同的问题。
资深工程师有时候会被赋予技术领导的角色。比如,首席工程师(lead engineer)通常仍会设计及编写代码,但同时协助管理团队的时间表,并决定项目的整体技术方向。从人力资源的角度来说,首席工程师有时候也会直接管理下属。
有些公司设有一位或多位技术总监(technical director, TD),负责从较高层面监督一个或多个项目,确保团队能注意到潜在的技术难点、业界走势、新技术等。
某些工作室可能还有一个和工程相关的最高职位,这就是首席技术官(chief technical officer,CTO)。 CTO 类似整个工作室的技术总监,并履行公司的重要行政职务。
游戏界有云:内容为王(content is king)。艺术家肩负制作游戏中所有视听内容的重任,而这些内容的品质能够决定游戏成败。下面来了解一下艺术家的不同分工。
概念艺术家(concept artist)
通过素描或绘画,让团队了解游戏的预设最终面貌。
概念艺术家的工作始于游戏开发的概念阶段,一般会在项目的整个生命周期里继续担任美术指导。游戏成品的屏幕截图常会不可思议地贴近概念艺术图(concept art)。
为游戏世界的所有事物制作三维几何模型。
这类人员通 常会再细分为两类:前景建模师(foreground modeler)及背景建模师(background modeler)。前景建模师负责制作物体、角色、载具、武器及其他游戏中的对象,而背景建模师则制作静态的背景几何模型(如地形、建筑物、桥梁等)。
由于人物建模和其他物体或场录的建模在技术及工作方式上有很大分别(例如前者需和动画师紧密合作),所以很多公司打独立的角色建模师(character modeler)或称为角色艺术家(character artist)。
制作称为纹理(texture)的二维影像。这些纹理用来贴附于三维模型之上,以增加模型的细节及真实感。
布置游戏世界的静态和动态光源,并通过颜色、亮度、光源方向等设定,加强每个场景的美感及情感。
为游戏中的角色及物体加入动作。
如同动画电影制作,在游戏制作过程中,动画师充当演员。但是,游戏动画师必须具有一些独特的技巧,以制作符 合游戏引擎技术的动画。
游戏和动画电影的主要不同之处在于,游戏的角色能回应玩家的输入。这种互动性需要各个动画片段能互相结合,所以其制作过程也和动画电影有所不同。
提供一些原始的动作数据。这些数据经由动画师整理后,置于游戏中。
与工程师紧密合作,制作并混合游戏中的音效及音乐。
为游戏角色配音。
为游戏创作音乐。
如同工程师,资深艺术家有时候会成为团队的领导。一些游戏有一位或多位艺术总监(art director),他们是资深的艺术家,负责把控整个游戏的艺术风格,并维持所有团队成员作品的一致性。
游戏设计师(game designer)负责设计玩家体验的互动部分,这部分一般称为游戏性。
不同种类的游戏设计师,从事不同细致程度的工作。
有些(一般为资深的)游戏设计师在宏观层面上设定故事主线、整体的章节或关卡顺序、玩家的高层次目标。
其他游戏设计师(又称作关卡设计师,level designer)则在虚拟游戏世界的个别关卡或地域上工作,例如设定哪些地点会出现敌人、放置武器及药物等补给品、设计谜题元素等。
其他游戏设计师会在非常技术性的层面上和游戏性工程师 (gameplay engineer)紧密合作。部分游戏设计师是工程师出身,他们希望能更主动地决定游戏的玩法。
有些游戏团队会聘请一位或多位作家(writer)。游戏作家们的工作范畴很宽,例如,与资深游戏设计师合作编制故事主线,以至于编写每句对话。
如同其他游戏专业领域,有些资深游戏设计师也会负责管理团队。很多游戏团队设有游戏总监(game director)一职,负贵监督游戏设计的各个方面,帮助管理时间表,并保证每 位游戏设计师的设计在整个游戏中具有一致性。资深的游戏设计师有时候会转行为制作人。
在不同的工作室里,制作人(producer)的角色不尽相同。
有些游戏公司,制作人负责管理时间表,并同时承担人力资源经理的职责。
有些游戏公司里,制作人主要做资深游戏设计师的工作。
还有些游戏工作室,要求制作人作为开发团队和商业部门(财政、法律、市场策划等)之间的联系人。
有些工作室甚至是完全没有制作人。例如在顽皮狗(Naughty Dog)公司,几乎所有员工,包括两位副总裁,都直接参与游戏制作,工作室的资深成员分担了团队管理工作及公司事务。
游戏开发团队通常需要一支非常重要的支持团队,包括工作室的行政管理团队、市场策划团队(或一个与市场研究公司联系的团队)、行政人员及 IT 部门。
IT 部门负责为整个团队釆购、安装及配置软硬件,并提供技术支持。
游戏的市场策划、制造及分销,通常由发行商(publisher)负责,而非开发游戏的工作室本身。发行商通常是大企业,例如艺电(Electronic Arts, EA)、THQ、维旺迪 (Vivendi)、索尼(Sony)、任天堂(Nintendo)等。
很多游戏工作室并不隶属于个别发行商,这些工作室把他们制作的游戏,卖给出最好条件的发行商。
还有一些工作室让单一发行商独家代理他们的游戏,其形式可以是签署长期发行合同,或是成为发行商全资拥有的子公司。例如:
THQ 的游戏工作室都是独立运作的,但 THQ 拥有这些工作室,并对它们有最终的控制权。
艺电更进一步,直接管理其下属工作室。
另外,第一方开发商(first-party developer)是指游戏工作室直接隶属于游戏主机生产商(索尼、任天堂、微软)。例如,顽皮狗是索尼的第一方开发商。这些工作室独家为母公司的游戏硬件制作游戏。
很多游戏幵发者认为自己能写逻辑就等于掌握了游戏开发技术,引擎对自己来说无足轻重,这种想法是有问题的。
首先你写逻辑是在引擎的基础上写的,其次如果你对引擎一无所知,非常不利于你去深入理解逻辑开发。相反,如果你对引擎有深入的研究,你调用引擎提供的接口时可以很清楚地知道其内部是如何实现的,这样有助于写一些引擎的辅助功能算法,提升自己的编程能力。
我以前在 xxx 公司工作时,项目组就有一位逻辑程序员在做功能时,需要在原有引擎接口的基础上增加一些算法编程以满足游戏玩法,当时他并没有求助引擎组的同事,而是自己写出来了,因为他自己平时就喜欢钻研 3D 游戏引擎,了解引擎接口内部是如何实现的,这本身就证明了他的编程能力。最后将其吸纳到拥有公司最核心技术的引擎项目组,薪酬和职位同时得到了提升。
因为在公司里面会写算法,或者会 GPU 编程的人相对来说非常少,如果你掌握了 3D 引擎开发技术,不仅对于逻辑开发更加有利,而且对于你技能提升帮助非常大。
目前各大游戏公司,比如网易、腾讯、EA、任天堂等国内外知名的 IT 公司,还有许多新兴的 VR/AR 公司非常紧缺 3D 引擎资深程序或者图形学引擎开发人员,开出了非常诱人的薪水和待遇,从中可以看出,目前游戏市场对于这类人才需求还是非常紧缺的。这正是一个学习 3D 引擎幵发的好机会,俗话说“机不可失,时不我待”。
回到正题,3D 引擎这么重要,那作为新手应该如何着手学习?换句话说,关于开发 3D 引擎要具备哪些条件?网络上有许多这方面的解答,我经过多年对 3D 游戏引擎的开发研究和实践经验,在此主要总结了以下六点供大家学习参考。
1) 首先必须掌握主流开发语言C语言、C++、Java或 C#至少一门编程语言。
2) 编程离不开 数据结构;
大学课程里面学的数据结构对于游戏开发非常重要,数据结构在游戏开发中主要用于数据存储及内存管理,开发 3D 引擎常用数据结构有数组、链表、哈希表等,以及常用的一些查找算法:快速排序、二叉树查找、二分査找等,对于常用的数据结构要重点掌握。
为引起读者重视,在此再重点强调一下,数据结构对于游戏开发非常重要。
3) 线性代数对于开发同样非常重要;
掌握线性代数的目的是在游戏开发中灵活地运用向量、矩阵、四元数,以及欧拉角这些基本的数学运算解决问题。3D 固定流水线中的坐标变换和可编程流水线的顶点和像素转换都是使用线性代数运算完成的,运算主要涉及游戏幵发中的物体移动、旋转、缩放,以及点乘和差乘等。
4)学习图形库;
现在的 3D 游戏引擎渲染都是基于 DirectX 或者 OPENGL、OPENGLES 这些图形库完成的,这就需要开发者能够熟练地使用图形库的接口开发程序。在当前移动端跨平台非常火热的情况下,建议大家学习 OPENGL 图形库。
3D 引擎的核心功能就是对游戏的场景渲染和物体的材质渲染。
5)掌握至少一种显卡 GPU 编程语言
场景渲染使用的是后处理渲染效果,比如 Bloom、Blur、 Ssao、Pssm 等。这些效果实现与 GPU 编程息息相关,要求大家至少掌握 GLSL、HLSL 或 CG 这些基于显卡 GPU 编程语言的一种。
6) 学习图形学算法;
游戏要实现一些逼真的效果离不开算法的支持,比如柔体的模拟、刚体碰撞效果及曲线插值算法等。
学习图形学算法,建议大家看一下《算法导论》这本非常经典的书籍,以上说的这些是引擎中比较深层次的知识点。
7) 设计模式:
另外,在框架设计方面,需要掌握设计模式里常用的如工厂模式、单件模式、状态模式、MVC模式等。设计模式的使用不能靠死记硬背,需要将其灵活运用到项目幵发中,这样才能逐步深入领会其设计精髄。
初学者在使用设计模式的过程中会出现一个误区:千万不要为了使用设计模式而使用设计模式,过度使用会得到适得其反的效果,凡事要把握一个度。以前公司的同事为了使用设计模式,不论设计什么模块都要用设计模式,最后导致在模块扩充时出现了很多问题,举这个例子的目的是告诉读者好东西也不能乱用。
我从没有在做架构设计时去特意考虑用哪种设计模式,都是顺其自然地使用,真正的用剑高手,可以做到手中无剑,心中有剑的境界。
以上七点是笔者对 3D 游戏引擎开发的心得体会,建议大家循序渐进、由易到难地学习。
游戏开发最核心的技术是算法,在游戏开发中占非常大的比重,也可以说是引擎核心中的核心,以笔者亲身开发项目经历给大家分享一下,希望起到抛砖引玉的效果。
近期与高校科研机构合作研发了一款海水渲染 3D 引擎,可以逼真地模拟真实海浪,以及海浪在不同的天气实现不同的效果,模拟船在海中随海浪上下浮动和直升机在海浪上空悬停风力与海浪的作用效果等。
在实现的过程中使用了很多算法,比如 Perlin 噪声算法、弗洛伊德算法,以及物理算法等。
如下图所示,是基于 GPU 编程模拟的旋涡。
图1:旋涡模拟
技术的掌握不是一朝一夕能够完成的,关键在于坚持,首先要做的是打好基础,在真正掌握了基础知识后,再提升是非常快的。
做游戏引擎也是知识积累的过程,虽然现在的 3D 引擎非常多,自己幵发游戏引擎己经不现实,但要想真正地深入学习游戏开发核心技术,至少应该知道引擎的底层是如何实现的,换句话说就是其工作原理要搞清楚,这对于开发者来说非常重要。
不要再把自己局限于代码操作工简单地写写逻辑,这对自己的技术提升没有任何帮助的。要做到对游戏开发知其然知其所以然,就必须学习 3D 引擎开发技术,特别是对刚踏入游戏行业的从业者,每天坚持不断地学习,如果能持续不断地学习 10000 小时,你肯定会成为 3D 引擎高手。
这就跟锻炼身体一样,其实锻炼身体非常能够磨炼一个人的心性,锻炼一个人的意志力。
自己尝试开发一款小的游戏引擎,即使不能成功,但过程也是非常重要的,你从中可以学习到很多知识,经验的积累对自己的发展帮助非常大,这也是为什么游戏公司招聘,首要的条件是应聘者要有实际开发项目工作经验。