近期对3D引擎的架构设计做了一个梳理总结,现在开发游戏都离不开引擎,这些引擎包括Unity引擎,虚幻引擎,Cocos2dx引擎,自研引擎等等。很多开发者只会利用他们写逻辑,遇到优化问题就束手无策了,遇到Shader编程以及优化就感到头疼,长此以往对自己技术提升非常不利的。要改变现有的状态,就必须要系统的学习相关3D引擎技术,这样才能在使用引擎开发产品时得心应手。本篇博客从三个方面给读者做讲解,一是学习3D引擎;二是选择引擎开发产品,三是如何学习一款引擎,下面先从学习3D引擎开始。
经历过多年的引擎研发和引擎使用,在此我先把学习引擎以及相关技术模块给读者列出来,技术框架图如下所示:
在上述框架图中共分为七部分,每一部分所包含的技术点并不局限于图中所列,在此一一给读者解释一下:
第一部分内容:是告诉读者学习3D引擎架构知识的前提,就是要掌握引擎的编写语言和引擎使用的图形库API接口,以及图形学渲染也就是GPU编程使用的Shader语言,基础知识是必须要掌握的。学习时可以参考这些API提供的Demo,把执行流程搞清楚,自己调试一下就可以了。
第二部分内容: 3D基础知识,比如一个3D模型要在二维屏幕上显示出来,这中间要经历一些矩阵变换才能将其在二维屏幕上显示出来,这种变换过程通常称为固定流水线,就是告诉读者它的显示是按照固定流程,它的计算都是在CPU中完成的;对应的就是可编程流水线,也就是在GPU中完成,其实就是将矩阵变换放到GPU中计算了。
第三部分内容:3D游戏引擎的技术点,在掌握了第二部分内容后,再开始学习第三部分内容,该部分内容针对的是DX的SDK或者OpenGL的SDK,二者都提供了Demo供读者学习,我们要把这些基础的3D引擎技术掌握,最好的方式是自己用手把代码敲一遍,调试一下。
第四部分内容:需要一定的数学知识,引擎的开发或者游戏的开发离不开算法的支持,当然大家也不用对其产生畏惧心理,学习任何事情都不是一蹴而就的,循序渐进的,先从基本的数据结构入手,逐步深入,图中列出的几种算法是引擎中常用的算法,四叉树或者八叉树可以用作地形的绘制,插值算法可以用于实现刀光拖尾等等,A*算法比较经典是寻路使用的,另外还有后处理算法实时阴影的网上都有很多现成的案例。
第五部分内容:这部分内容是核心的架构设计,图中所显示的是组成引擎的各个模块,场景管理模块,该模块非常重要,地形的加载通常是通过分块的方式处理的,比如魔兽地图,显示的是9块,在缓冲中的是16块,随时提供加载,场景中少不了水的渲染,这个也体现了引擎的技术层次,大家可以看看虚幻水的渲染,达到了一个顶级水准。模型插件也是必须的,Unity和现在开源的虚幻使用的都是AutoDesk提供的FBX模型,AutoDesk提供了FBX的API可以直接使用,当然自己也可以开发适用于自己引擎的模型插件,自定义格式。AI模块这里主要是指行为树算法,各种各样的灯光模块也是必须的,对应的就是相机模块,比较常用的是透视摄像机和正交摄像机,特效和UI也是引擎的组成部分,剩下最重要的是物理引擎模块,碰撞检测处理,常用的碰撞算法:Mesh碰撞,球体碰撞,胶囊体碰撞,立方体碰撞,这些碰撞算法的核心是OBB或者AABB算法,当然还有肉体碰撞处理,另外,引擎很重要的部分是关于内存管理,这部分内容将在后面的博客中介绍。
第六部分内容:3D引擎中的GPU编程,这个是令大部分程序员头疼的问题,不同的引擎使用的渲染算法是不一样的,它们主要区别还是在细节贴图方面的区别,以UE4为例,他渲染一个物体使用的材质相比Unity多一些,通过它们渲染的物体就可以看出来。快速的学习GPU编程,网上都有对应的Shader代码,可以直接在此基础上修改。还有可以直接使用Shader编辑器用于Shader的编写,调Shader效果我们可以参考Max或者Maya模型工具中的渲染效果,Max或者Maya中都有渲染Shader,它们功能很强大,引擎是无法与其攀比的,只能与其无限靠近。而且Max和Maya可以为我们提供使用了哪些Shader。该部分内容主要是针对模型的材质渲染。
第七部分内容:主要是针对引擎的后处理渲染,常用的有PSSM,HDR,Blur,Deferred等等,这些效果是在游戏的每帧图像显示之前再进行一遍后处理渲染,然后显示出来,这就是后处理渲染效果。
上图只列举了七部分内容,还有一个技术点,开发者要掌握——设计模式,与引擎开发相关的设计模式比如:单例模式,工厂模式,观察者模式,状态模式等等吧,只要能熟练掌握这些就足够了。上面框架图是给想学习引擎的读者推荐的,作为游戏开发者来说,学习引擎对自己技术提升帮助还是非常大的,不要只局限于逻辑的编写,要想成为主程,技术经理,技术总监必须要学习引擎技术。
以上是关于读者自己学习引擎的内容,现在网上有很多开源引擎,比如:Ogre引擎,虚幻引擎。。。。。
面对这么多开源引擎,作为读者如何去选择一款适合自己产品研发的引擎至关重要。
开发产品首先要做的事情是选择引擎,市面上很多引擎供读者使用,游戏产品从大的方面说是页游,端游,手游;从表现形式来说有2D,3D之分。不同的产品设计对应着不同的引擎选择,现在H5游戏逐步出现了,相关的H5引擎也跟着出来了,比如:白鹭,layaBox,cocos-js。2D引擎目前还是cocos2dx引领,3D引擎的选择有Unity3D引擎和虚幻引擎,二者最大的区别是一个开源,一个不开源,当然掌握难度要看不同的人使用。选择引擎首先要考虑的问题是:
一、是该引擎是否有对应的上线产品出来,可以去下载玩玩,体验一下。
二、与该引擎相关的工具是否完备,比如场景编辑器,特效编辑器。。。。
三、该引擎上手是否比较快,这个也是重点考量的;
四、该引擎相关的文档是否完整或者详细,另外对应的论坛或者社区是否能够快速响应;
五、不同的机型适配性是否满足项目需求;
六、功能扩展性,这个涉及到代码的开源了,有第三方库并且支持第三方库开发;
七、对引擎支持的场景面数以及骨骼动画,特效做一个压力测试;
选择引擎一定要根据自身项目需求来定,这个也关系到项目成败,比如做一些3D仿真项目,要求品质比较高,这个就要考虑虚幻引擎了,当然使用的人必须具备C++编程能力,否则即使你选择对了引擎,但是项目组的人不会用也是不行的。
3D手游开发,这个选择Unity引擎开发,Unity引擎的优点这个大家都知道,就不介绍了,当然缺点也比较明显。
选择好了引擎,如何学习一款引擎,因为你不能保证项目组的每一个人都会使用。
选择好了引擎后,下面就要开始学习了,学习一款引擎可以从先整体后部分,或者说先粗后细的原则。
首先,看一下这款引擎的文档,它主要能解决啥问题。
其次,引擎的架构设计图,从整体上对整个引擎有所了解,以及类层次关系。
以上是粗看,目的是至少做到对引擎有个整体的概念。下面就是细看了,
先从引擎提供的官方Demo入手,把整个执行流程通过调试的方式学习一下,在此过程中也能了解引擎使用的坐标系以及模型格式,模型插件等等吧。而且能对场景的加载处理都有所了解,通过调试的方式可以深入到引擎内部,假设该引擎提供了源代码。下一步再demo的基础上尝试做一些修改,加一些功能,加深对引擎的理解。
对于程序开发者来说,市面上比较常用的引擎技术都是相通的,深入理解了一款引擎,再学习其他引擎就很容易了。我以前是做端游开发的,端游开发的经验对我开发手游帮助很大,我自己也写过引擎,自研引擎的经验对于使用Unity引擎和虚幻引擎这些成熟引擎开发产品就非常容易了。
开发者在学习引擎时,可以先从Ogre引擎入手,该引擎对与渲染做的比较好,而且该引擎没有其他杂七杂八的东西,比较干净非常有助于开发者学习。以前用Ogre引擎开发过比较著名的端游是《天龙八部》,效果也是不错的,证明该引擎可以用于商业开发,本篇博客只是从大的方面给读者聊了聊3D引擎技术,下一篇给读者介绍关于GPU编程优化的问题。