游戏引擎在国内还是有一批人走在前沿的,但出于种种的原因发展的并不是很好,并且引擎的神秘面纱和不可揣测的高难度使一些人还没有正式开始就已经打了退堂鼓。通常我们说游戏引擎的时候总是想到3D游戏引擎,的确游戏引擎发展到今天将它发挥到极致的正是3D引擎,但在3D引擎之前其实还是有很多2D,2.5D游戏引擎的,它们现在虽然看起来很弱,但却为3D引擎的产生提供了巨大的理论支持。
原理上讲引擎的结构真的很简单,并没有大多数人想的那么复杂。本篇文章不会讲更复杂的引擎,仅仅针对j2me来讲,但麻雀虽小五脏俱全,我们不能因为j2me游戏可能连一幅图片的大小都不如而放松对引擎的要求,一方面是理论的需要,另一方面引擎一但开发成功可以大大减少程序与美工的工作量和提高产品质量和数量。如果单单讲非常抽象的讲引擎的话大家可能非常难以接受,那么我就从一个和游戏非常相近的产业开始说起。这个产业就是电影。电影从某种程度上给与了游戏引擎以丰富的抽象框架与理论,也可以说功不可没。那么Ok,我们就从一个电影的拍摄过程来了解引擎的各个部分吧。我们为了逻辑上的严谨首先要声明几个前提条件:
1.剧本已经有了(游戏策划案) 2.拍电影需要的资源(道具,群众演员(NPC),主角。这些其实就相当于游戏开发过程中的资源,美工已经把东西都做OK了)
下面是一个电影拍摄的场景:
人物:导演,剧务,摄影师,主角,其它演员(张三,李四等等),其它剧组人员
道具:一把枪,一个木箱,几个麻袋,一个药箱,一个弹夹
场景:狭窄的街道,两旁是破旧的房子,碎石地面
摄影机:两个
(0)这是一个抗日英雄在街道与敌人殊死搏斗的,姑且叫片断吧
(1)马上要开拍了,可是东西还没有准备好,导演见此状大喝:剧务,根据我给你的单子把道具搬出来!听到导演要求道具,剧务开始行动。嗨咻~嗨咻~ 终于从库房里搬出了所有道具并根据要求摆放到了相应的位置。“动作这么慢,你是MOTO吧,人家Nokia比搬的快多了。”:导演喝道。
(2)道具摆好了,导演对当前的摄影又不满意了,嘿你们怎么回事,快把镜头移到xx去,于是摄影师又将镜头摆放到了合适的位置
(3)“嗨,说你那,张三,到那儿去,站好了别动。李四,站在xx,都别动啊,等镜头移过去了再按我教给你的动”:导演喝口水说到。
(4)“嘿嘿,主角大人,您看您准备好了吗?要不,您站到xx去?给您一把枪,唉呦呦,别对着我啊”导演讨好道。
(5) 各就各位,开始。。。
暂时先把电影的问题讲到这儿,我们一起来看看,当中都包含了那些和引擎中相同的元素,从上面的编号开始说。
(0)叙述了一个故事的片断,请大家想想和游戏中哪部分很想象?没错,脚本!它在大体上叙述了当前描述了一个什么故事,以及故事中各个角色将要发生的行为和事件,比如:主角被张三打了一枪托,李四被主角打死等等,而张三和李四被打死后主角冲出包围,那么放到游戏中通俗的说就相当于主角过关的条件,张三李四的死触发了剧情继续往下发展的事件。举一反三,我们的游戏如果关卡的BOSS被干掉了,才能继续往下玩,够直白了吧。OK,这是脚本系统。
(1)剧务根据导演的要求从库房拿出了道具并且摆放到了场景中。这在引擎中又代表了什么呢?1.导演,2道具,3场景,它们很好的将引擎几个大的部分抽象了出来。
导演=场景控制器
剧务=场景管理器
场景=场景系统
“导演”通过向“剧务”发出请求,“剧务”根据请求将资源载入,并将资源放到自己的管理列表中,而具体放到什么位置,则是“导演”来控制,等资源使用完毕,“剧务”将资源从列表中释放。这是很重要的一个过程,也许100个程序员有100种控制方法,但目的只有一个,在有限的空间和CPU资源中最大程度照顾I/O效率与执行效率。(后面章节会有一些典型代码与控制方法供大家参考)
说到“场景”这个就比较让我头疼了,原因是抽象它到引擎中比较难,就不说大家看不懂的话了,它就是我们做游戏时的地图系统。游戏到那个“场景”受“导演”控制,而资源依然受“剧务”管理。这样说大家明白了吧。
关于场景控制器下面会有专门的一章来说。
(2)导演要求镜头怎么怎么样,这代表了什么呢?根据我们以往的经验,似乎找不到更合适的。但细细想又能找到些什么线索。镜头将当前的场景截取了一部分,然后呢,将影像录制到了底片上,哦,是不是这样呢?镜头相当于我们当前要“渲染”的场景区域,“摄像机”将区域中所有元素“渲染”到底片上,而“底片”相当于我们的屏幕呢?OK,越来越接近了,没错,引擎中最最重要的部分出来了“镜头”和“渲染器”。在3D引擎中这两个部分几乎占去了6成的开发时间,在引擎的评估中恐怕效果好不好是我们最直观的一个因素了吧。大家都是玩游戏的,这点能理解。当然,“摄像机”仍然在受“导演”的控制,从这里不难看出,一个好游戏“导演”是多么的重要,即不能喧宾夺主哄抢系统资源,又要起举足轻重的作用。这也是我们设计引擎难点之一,之二嘛就是“摄像机”和“渲染器”了,至少笔者是这么想的。
(3)(4)仍然是在描述“导演”的作用,只不过多了“群众演员”,它最好理解,其实就相当于游戏中的NPC,他们有自己的行动模式和相关属性。看着简单,却不知有多少程序员在有限的资源下增加他们的AI付出了巨大的心血。向程序员致敬,程序员是伟大的职业...别~别~~~!扔臭鸡蛋,我接着说还不好嘛。
(5)“各就各位,开始。。。”为什么要把它单拿出来呢?实际上我是想大家回顾和消化一下上面拍电影都作了哪些工作,以及真正的引擎在游戏开始前都要做哪些工作,方便更好的理解引擎各部分的作用,从抽象到现实开发有一个比较。好啦,我目前对引擎结构的理解就是这样了,知道多少说多少,还可能有不对的地方,希望大虾们批评指正,免得害了小蟹们。下面我们做一个小结
故事片断 = 脚本系统
导演 = 场景控制器
剧务 = 场景管理器
镜头 = camera
摄像机 = Render(渲染器)
场景 = 地图系统
群众演员 = NPC
还有一个不得不说的部分,就是机器本身的事件处理模块,放到手机中理解就是键盘事件,来电事件,异常事件等等,因为和拍电影没什么太大的关系,所以单拿到最后来说。别忘了咱们的“主角”可是受外部事件才驱动起来的。并且“主角”的行为很大程度上影响了“导演”的指挥,比如“主角”受到键盘事件向前走,那么“导演”就要求“镜头”也要跟进,“场景”也跟着变化,而在什么时候出现“群众演员”也是跟着变化的。