3D游戏引擎系列四

笔者介绍:姜雪伟,IT公司技术合伙人,IT高级讲师,CSDN社区专家,特邀编辑,畅销书作者,国家专利发明人;已出版书籍:《手把手教你架构3D游戏引擎》电子工业出版社和《Unity3D实战核心技术详解》电子工业出版社等。

CSDN课程视频网址:http://edu.csdn.net/lecturer/144

今天是春节第一天,但是还是想写写博客给读者,以下是摘自《手把手教你架构3D游戏引擎》一书中的部分内容,目的是想告诉读者,再开发引擎或者写逻辑模块时,要注意模块之间的耦合性。如果想了解详情可以查阅该书。

在设计引擎时,首先我们要做的是把整个引擎的框架设计好,引擎设计采用的都是模块化开发,这样既方便接口封装也便于逻辑层去调用,同时降低了模块之间的耦合性。下图所示的架构:


是本着实用性的角度设计的引擎架构图,图中显示了三部分内容:Core底层算法、Engine引擎、Game游戏。引擎架构设计主要是分为Core和Engine,下面主要介绍引擎的这两部分。

第一部分是Core作为最底层的封装也对外提供逻辑编写接口,主要功能包括自定义类型类设计,用于处理引擎所需要的定义类型;视景体封装主要用于处理相机裁剪,在相机可视范围内的物体是可视的,在相机外的物体是被裁剪掉,也就是不可视的;游戏灯光设计是用于照亮游戏场景,场景中如果没有灯光是漆黑一片,这个跟现实生活中白天和黑夜类似。在该引擎中实现了三种类型的灯光,材质主要是通过照射在物体表面的光照反射体现的。引擎底层涉及到很多矩阵和向量的转换运算,固定流水线核心就是矩阵之间以及矩阵和向量之间的转换。

第二部分是Engine的封装也是作为游戏逻辑的接口,最终跟ECore工程一样编译成静态库或者动态库用于编写游戏逻辑调用。实现功能包括游戏场景中相机的封装,在Engine层实现的相机类将调用ECore层的视景体接口实现裁剪功能。图形绘制功能接口主要是用于绘制游戏场景的物体,输入接口处理的是用户与游戏交互操作;3D游戏引擎提供支持3D模型的加载以及读取功能;游戏对象类是场景中所有物体对象的父类,在逻辑层实现的具体对象类都需要继承该类。另外游戏运行时必须要有游戏窗口,游戏窗口的定义是在引擎内部实现的。游戏中所有的元素都是场景管理类创建出来的,比如关卡,灯光,模型,文字信息等。最后使用引擎接口去实现一款小游戏,下节的任务是在该架构设计的基础上对功能模块继续细分。

模块功能细分主要分为两步:第一步先把游戏开发中使用的主要模块划分好,不需要考虑细节;第二步再在第一步的基础上把功能模块细分,这么做也是为了给团队成员分配任务,在细分的过程中再完善第一步的模块增加一些细节,通过以上两步就可以把游戏架构实现出来。说起来简单,做起来难,要能熟练的运用架构思想需要开发者不断的去开发产品积累经验。不论什么游戏产品都需要引擎的支持,比如现在市面上比较流行的引擎Cocos2d-x、Unity3D、UE4等引擎,引擎的效率也直接影响了游戏运行的效率,本书实现引擎架构的方式是把对物体渲染、事件输入、相机、场景、模型等这些主要的模块进行封装。对模块细分的目的主要是便于协同编程开发同时减少模块之间的耦合性。再此多强调一点,在游戏公司多人协同开发时,特别是在提交代码时经常会出现代码冲突,如果经常发生这种事情,这说明对于模块的划分方面需要再仔细考虑一下。有的人可能会问,如果对模块细分还是达不到要求咋办?还有一种方法可以帮你完善架构,就是代码重构。代码重构就是把以前写的代码有设计不好的模块重新编写,代码重构有几个原则:采用局部重构,不要做整体重构。整体重构风险不可预估,因为整个游戏是多人开发,涉及功能模块太多,一个人在短时间内很难完成。另外如果产品要上线了,此时不可做重构。还有重构的目的是让代码执行效率更高,代码更容易扩展,阅读代码比较方便,千万不要因为重构把以前的功能改变了,这样的重构不要也罢。模块细分架构如下图:


本书引擎利用3D固定流水线实现了引擎的整个渲染流程,在渲染物体的过程中为了优化效率使用了渲染列表,把没有被相机剔除的物体插入到渲染列表中,然后对物体进行背面消除。对渲染列表中的物体执行3D固定流水线流程,首先进行的是世界坐标到相机坐标变换,再从相机坐标到透视坐标变换以及从透视坐标到屏幕坐标变换,从优化角度考虑,渲染列表中的物体会按照一定的规则进行增加和删除操作,最后将存在渲染表中的图绘制出来,这也是本书引擎最核心的思想。渲染流程如下图:



本章主要是告诉读者在模块划分时需要细致考虑,游戏文字的绘制采用的是GDI图形设备接口,整个渲染流程采用的是渲染列表进行处理。模块划分的思想这对于开发游戏逻辑也是适用的,在公司里面很多程序员在做开发时拿过策划案子,不假思索的就开始写逻辑,因为大家心里着急,只想着快速实现功能,可能在比较短的时间写完了。但是游戏的需求会经常变化,写的逻辑框架必须能适应不断的需求变化,这就要求在写代码之前全面仔细的把问题思考完整,思考的时间尽量长一些,思路清晰了,代码写起来很快的。在此分享一下经验:我做游戏开发时主要分三步:第一步先把案子从头到尾看一遍,对于不懂的地方跟策划去沟通,因为在沟通的过程中,可以帮你解答很多疑惑。第二步把整个策划案子通过画架构图或者说模块图理顺一下思路。第三步对功能模块再进行细分,这个细分程度是可以根据它写代码的。完成这三步后,再写代码就非常简单了。架构思想讲完了,接下来开始进入代码编写的实质性阶段。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

海洋_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值