为了能让开发者重视引擎开发,最近一直在写一些关于学习引擎的一些博文,为此还写了一本入门级引擎开发的书籍《手把手教你游戏引擎》电子工业出版社,供初级开发者学习。接下来我还会写一些关于引擎方面的博文,供读者参考。
十多年前,笔者刚踏入游戏公司做研发时,公司当时并没有3D游戏引擎,公司研发游戏都是在上款已研发好的产品基础上进行修改,换句话说就是“换皮”。做的时间久了会遇到相同的代码逻辑在不同的游戏项目里面重复出现,行业里面俗称:“重复的造轮子”,开发者在开发产品时通常的做法就是复制粘贴,导致项目出现bug的概率非常高,大大降低了研发效率。为了改变这种现状,公司安排专门的人尝试着把游戏里面常用的代码抽离出来,重新做一个新工程编译成静态库LIB或者动态库DLL,这样3D引擎的雏形开始形成了。随着工程的代码量不断增加完善,久而久之,3D游戏引擎就形成了。开发3D游戏引擎目的是简化游戏制作的复杂度,缩短游戏开发周期,降低产品制作成本,因为封装好的引擎可开发多种类型的产品。
学习引擎首先要明白什么是引擎?引擎是用来做什么的?在现实生活中很多开发者对引擎的概念比较模糊,市面上也有很多关于3D游戏引擎的书籍,但是介绍的都不是很清晰,或者介绍的面太广不利于初级开发者学习。在这里打个形象一点的比喻介绍3D游戏引擎,以汽车的发动机为例,驱动汽车在公路上行驶的是发动机引擎,汽车发动机引擎是驱动汽车行驶的动力源。不论是油箱还是驱动轴等都要受发动机控制,换句话说,发动机就相当于一个控制模块,控制所有其他设备运行。发动机的性能也决定了汽车的性能,围绕发动机引擎可以制造出多款不同型号的汽车。知识来源于生活,3D游戏引擎的原理与汽车发动机引擎的原理是类似的,游戏的逻辑模块也是在游戏引擎的基础上实现出来的。游戏开发者只需要调用引擎提供的接口编写逻辑,引擎的渲染效率直接影响游戏运行效率,引擎的渲染品质直接决定了游戏的渲染品质。当然用同一款引擎可以做出许许多多款游戏,最直观的就是Unity引擎,使用Unity引擎研发的产品种类非常多,接下来介绍引擎的工作原理。
随着IT产业的蓬勃发展,越来越多的开源3D引擎,商业3D引擎都涌现出来了,其中最具代表作的是广泛运用于移动端开发的引擎和虚幻4引擎以及开源图形学OGRE引擎。Unity引擎在市面上比较流行,相信大多数IT开发者都使用过,先以Unity3D引擎为例介绍引擎的原理,Unity3D引擎提供了一个功能非常强大的编辑器供用户开发使用。支撑编辑器运行的是许多已经封装好的DLL文件,读者可通过其安装目录查看到许多DLL动态库文件,这些封装的DLL动态库就是Unity3D引擎底层封装提供的。游戏开发者在使用其开发游戏写具体逻辑时,也需要利用C#脚本调用动态库DLL封装的函数接口,从而能够执行引擎底层的代码实现出想要的效果。接口的使用可通过查看Unity帮助文档获取到,它的底层代码的实现对用户来说是不可见的,但是这不妨碍使用者开发项目,因为使用者只需要知道函数的功能就可以了。
3D引擎本身也是一种3D软件,主要负责处理游戏虚拟世界的渲染,3D引擎架构设计其实非常复杂,用到的知识点非常多,比如设计模式,多线程编程,,GPU编程等,但是不管多么复杂,其最基本架构思想还是模块化开发,就比如打篮球一样,不论采用那种战术跑位,最基本的还是挡拆战术。继续模块思想的讨论,以模块化思想设计的3D引擎便于扩展,可以有效的减少模块之间的耦合性。开发3D游戏引擎时,切记面面俱到,换句话说3D游戏引擎主要功能是渲染,在这方面做的比较好的是开源的Ogre图形学引擎以及商业引擎虚幻4,它们核心功能只是负责3D渲染,做3D引擎该做的事情。对于Unity3D引擎,它在3D引擎渲染的基础上还增加了网络库等功能,对于引擎来说显得过于臃肿,当然这里不是说Unity3D引擎不好,只是其功能太多,对开发者来说并不一定是好事情。对引擎自身来说也不一定时好事情,因为这样引擎的功能失去了重点,所以一提到Unity3D引擎,大家的第一印象是其跨平台功能与引擎核心功能渲染不搭边,而对于UE4引擎,大家的第一印象是渲染,UE4在渲染这方面做的非常专一,结果就是UE4引擎渲染功能比Unity3D引擎更强大。当然Unity3D引擎的优点也是非常多的,比如引擎的架构设计使用了组件的理念,使用脚本写逻辑,可以跨多个平台等。而且对于初学者上手非常快,这也是它能快速普及的一个主要原因。
如果要开发一款引擎具体如何做?以及引擎由那些主要模块组成?游戏引擎涵盖的模块非常多,它是一个处理游戏所有逻辑的系统。引擎渲染功能是否强大,决定了游戏渲染品质的高低,以及游戏渲染运行的流畅度。下面简单的介绍一下通用的3D游戏引擎架构:
游戏逻辑是最顶端,也就是所说的游戏产品,一般的游戏开发者都是开发这层的逻辑。3D引擎包括了很多功能模块,图1-1所列举的只是比较核心的引擎模块,引擎最终会编译成动态库DLL或者静态库LIB方便游戏逻辑开发者调用其函数接口。当然引擎模块内容对用户是不可见的,就像一个黑匣子一样,它里面封装了游戏开发用到的所有模块,比如图中所示的声音模块,渲染模块,内存管理,输入系统,物理系统等等。游戏引擎的渲染模块会选择使用微软的DirectX库和开源跨平台的OPENGL和OPENGLES图形库,图中所示的是传统的引擎架构图。市面上很多公司研发的跨平台3D引擎,都是基于OPENGLES图形库开发的,比如网龙,网易,腾讯,蜗牛,完美等知名IT公司都有自己研发的引擎,引擎的研发也代表着一个公司的研发实力。对于程序员来说,掌握3D引擎开发技术,就等于掌握了游戏的核心技能,在国内研发3D引擎的人毕竟是少数,所以3D游戏引擎研发市场缺口很大。所以作为程序员来说,应该努力去掌握3D引擎研发技能,这样在IT激烈的竞争中才能利于不败之地。