捕鱼游戏开发及其若干优化技术的研究

时间:2022-08-29 01:10:21

捕鱼游戏开发及其若干优化技术的研究

摘要:游戏开发过程中涉及很多关键技术,好的技术应用可以为复杂功能和卓越性能提供保障。该文以一款具体的捕鱼游戏设计为例,分析了游戏中的各种功能实现及优化技术,包括资源优化技术、压缩加密技术、碰撞检测技术、绘制优化策略、粒子系统、基于自由路径的鱼群算法、基于编辑器的路径生成技术等。通过运用这些技术,得到了较好的游戏结果。

关键词: 2D引擎; 资源优化; 路径编辑; 碰撞检测; 粒子系统

中图分类号:TP391 文献标识码:A 文章编号:1009-3044(2014)25-5877-06

The Research on Fishing Game Development and Optimization Technology

GAO Yun-peng1,HUANG Hai-ming2,3

(1.School of Computer Science and Technology , University of Science and Technology of China (USTC), Hefei 230026, China; 2. Institute of Automation, Chinese Academy of Sciences, Beijing 100080,China;3. China Lottery Online Co., LTD., Beijing 100011, China)

Abstract: Game development involves lots of key technologies, appropriate use of technologies can support realization of complex functions and perfect performance. This paper takes the design of fishing game for instance, analyzes the methods for realizing functions and technology for optimization including resource optimization, compress and encryption, collision detect, render optimization, particle system, fish group algorithm based on free path, path generation based on editor etc. Through the use of the above technologies, the game result is good.

Key words:2D engine; resource optimization; path editor; collision detect; particle system

近几年,捕鱼达人游戏的面世,引发了全民捕鱼的狂潮。人们为其中新颖的玩法设计,丰富而流畅的界面表现,极强的趣味性而深深吸引。目前捕鱼类游戏已经从手机游戏扩展到了网页游戏,街机游戏甚至端游领域。该文将以街机版捕鱼游戏开发为例,围绕系统架构,软硬件及算法等各方面进行阐述。

1 游戏整体设计

在游戏系统设计中,首先要进行架构设计,以满足功能、保密性、高效性为目标,同时兼顾成本因数[1-3]。

在基础硬件上,考虑成本,选择了业内流行的微特迈工业主机。在这种主机上可以安装各种操作系统包括xp、winCE、Linux等等,所以不会对后续的技术选型造成太大的影响。

在游戏正式开发前,游戏引擎的选择至关重要[4]。由于这里要开发的是2D游戏,所以可以在如下这几种2D引擎中选择,例如HGE、SDL、COCOS2D等等。考虑到开发团队的知识结构,并考虑到在Windows下开发调试比较便利,且winxp精简版消耗的内存较小,也适合于在工业主机上安装运行,所以最终我们选择了适合于windows操作系统的HGE引擎。在VS2008 IDE中进行编程调试,最终在成xp版本。

由于要支持游戏专用键板输入,包括按键、摇杆、投币器等等,所以需要设计一块IO控制板,将所有的输入信号进行收集,最终形成约定格式的报文,通过串口上传给上位机。

由于要进行图片资源保护,本游戏系统还需要设计一块加密板,用来存放游戏用到的图片资源。加密板上的资源数据块可以通过特定的指令从加密板读出到主机内存中,并通过加解密,完成资源的应用。

最终,本游戏系统设计了高效的资源管理模块、灵活的鱼动画系统模块、高效简约的碰撞检测模块、特效模块并采取手段提升了游戏系统的可靠性。

2 功能设计与优化

2.1 图片资源设计与优化

在游戏中会用到很多资源图片,图片越多,加载越慢,且磁盘及内存占用的代价越高。合理的技术应用以及合理的资源划分可以在满足游戏逻辑需求的同时,大大降低图片资源量,从而达到节约磁盘及内存空间,并缩短加载时间的目的。

2.1.1 使用合理的游戏逻辑技巧减少资源量

气球鱼是游戏中的一个特殊鱼种,这种鱼在被炮弹击中一下就会膨胀一下,不断击中就会不断膨胀变大(直到达到膨胀上限)。这里有一种通用做法是,根据该鱼的不同大小由美术制作对应大小的图,全部放入游戏资源中,程序在不同的时候调用对应大小的图片来生成精灵对象并进行绘制。显然,这种方法可以生成很精美的气球鱼对象,但是资源量很大。为此本游戏采用了一种优化方法,就是对于气球鱼,美术只需要制作出一张图,由程序根据逻辑情况来决定要给这个对象缩放多少倍,这样就大大降低了资源量。但是其弊端在于由于要进行运行时缩放,需要额外的计算量,而且由于要进行缩放,会导致最终的游戏对象看起来不如通用做法那么精美。为此,本游戏系统根据大家的可接受情况,加入了一些中间级别大小的图片,在运行时根据需要缩放的倍率来选择与之最接近的那个大小级别的图片,并在此基础上进行缩放,从而提升了精度。最终这种方法在运行效率、显示精度和资源量之间做了较好的平衡。同样的策略还被应用于食人鱼等体积可变的对象上。

2.1.2 使用实时特效粒子系统降低资源量

海底气泡被大量应用于海底场景的不同位置。如果采用图片序列的方法来实现,则需要做很多套序列图(显然做一套是不合适的,因为这样会使得每个气泡点效果都雷同),会占用大量空间。因此,在实际对于海底气泡的实现中,我们采用了粒子系统。通过预先在粒子编辑器中编辑好对应的气泡粒子效果,保存成为粒子特效文件;然后在程序中利用粒子系统引擎API进行调用,在游戏初始化时载入这些特效文件,然后在游戏运行过程中在指定位置激发,就实现了海底冒气泡的效果。这种方法所形成的资源量极低,且每次播放的效果都不同,没有雷同感。同样,在很多其他的场合例如全屏炸弹爆炸等等,都采用这种粒子系统技术来实现,大大降低游戏资源量,同时也减小了因大图片而导致的渲染压力。

2.1.3 对游戏对象进行合理划分降低资源量

游戏中的鱼的姿态动作是通过制作序列帧图片来实现的。对于鱼A的普通游动,需要序列帧图1a;对于鱼B的普通游动,需要序列帧图1b。

圆盘鱼是那些带自旋转圆盘底座的鱼的总称,是游戏中的一种表现。圆盘鱼与普通鱼一样,也是通过制作其序列帧图片来满足游戏对象动画的需要。

圆盘鱼A、圆盘鱼B游动动画所需要的序列帧图片如图2:

因此如果有N种鱼及其对应的圆盘鱼,则需要2N套序列帧图片。显然鱼A与圆盘鱼A这两套游动序列帧图有很多相同之处,基于此,我们对圆盘鱼A进行了如下分解:鱼A游动+圆盘底座自转,分解示意图如图3。其中鱼A游动就用序列帧图1a,圆盘底座自转就只需要一张圆盘底座图,然后由程序来控制其自转。在游戏中通过数据结构将两者的位置绑定在一起,最终实现了圆盘鱼。最终的表现与原始方案一致,但是其资源量变成了N套序列帧图片+1张静态图片,内存占用小了很多。

2.2 鱼动画系统的设计与优化

游戏中需要各种各样的鱼在场景中游动,鱼动画系统分为鱼的自身姿态动作和鱼的运动路径控制两部分。

2.2.1 自身姿态动作

本游戏中鱼的姿态动画都是基于序列帧图来实现的,正如上一节图1a、1b所示。通过美术制作出游动、被击毙、击中反应等序列帧图来实现其游动动作、击毙动作和击中反应动作等,最终通过hge序列帧动画对象的更新来实现。

2.2.2 运动路径控制

鱼的运动路径控制所需的游动路径可以由程序实时生成。也就是说通过算法计算鱼在下一时刻的位置和朝向就可以使鱼一直游下去。但是显然这种方法无法生成比较漂亮的路径,且实时计算会消耗较多的CPU资源,并很难保证鱼的运动区域的均衡性。因此,本游戏系统采用了一种基于“路径编辑器+路径读取绑定”的鱼运动策略。首先人工编辑生成多条路径信息存放在文件中(简称路径文件),然后再将某一条路径绑定到鱼上,这样鱼就可以按照路径文件中的信息来进行位置更新达到运动目的。这种方法的好处在于可以由美术人员来进行路径设计,生成比较漂亮的路径,且可以使所有的路径在整个场景空间中分布比较均衡。其弊端在于需要生成路径文件,从而占用一定磁盘及内存空间。

路径文件是文本文件,其形式可以设计成很多种,最直接的方法是将各帧的路径点的位置和朝向都记录下来,保存在文件中,但是这样会导致路径文件过于庞大,空间消耗代价太大。为此,本游戏系统设计并实现了一种基于贝塞尔曲线(Bezier)的路径生成方法:通过预先设定Bezier曲线控制点,通过插值公式可以生成路径上的所有路径点的位置和朝向。从而使得在路径文件中,只需要记录各路径的曲线控制点,在加载时再插值生成其他的路径点,在实际运行时根据当前时刻取出对应的路径点位置和朝向。这样使得最终路径文件很小,只需要极低的磁盘内存空间。最终我们设计的路径文件如下(这是其中的一条路径的描述):

3 //鱼的种类:此路径适合于哪种鱼

31869 //此路径主要在那些炮位附近

552 //此路径总共更新多少帧才结束 24 //每秒钟更新多少次

//控制点序列

//一个节点

-200 //基础路径点坐标

-174

-331 //与基础路径点对应的第一个控制点

-314

-66 //与基础路径点对应的第二个控制点

-35

803

604

408

335

1200

874

1791

1053

1562

741

2022

1365

可以看出这条路径通过三个路径点并有6个控制点。

为了便捷地生成路径,我们设计并实现了一个路径编辑器,通过在编辑器中可视化地直接进行控制点创建以及拖拽,可以直观的通过图形看到将要生成的路径的真实情况,并进行编辑调整,最终保存生成路径文件。考虑到Xml格式的文本文件可阅读性好且更容易被解析,所以最终路径文件被存成上述的XML格式。下图4是路径编辑器及其编辑过程的示意图:

游戏系统设计了基本路径类(BasePath)及其子类――Bezier路径类(BezierPath)。上述路径文件数据将在游戏初始化时加载进来并生成游戏内部数据结构――Bezier路径对象。

Bezier路径类的核心成员函数是MakePath(),该函数用相邻的曲线控制点通过插值递归生成路径上的其他路径点。

2.2.3 基于路径控制的鱼群算法

对于成队状的鱼群(2条以上),可以从预先编辑好的路径中选择一条Basier路径S1绑定到第一条鱼,然后在该路径上向前一段距离进行推算来计算生成Basier路径S2,并将Path2绑定给第二条鱼,以此类推,最终给此队列中这几条鱼都绑定合适的路径,从而保证了这些鱼是按照同一条路线鱼贯前进的。如图5是由两条鱼组成的成队鱼。其中一条路径是编辑器编辑生成的,另外的是程序推算得到的。

对于成散漫无序状的鱼群,可以从预先编辑好的路径中选择一条Basier路径S1绑定到第一条鱼,然后将该路径上的各控制节点进行随机方向的平移微调来计算生成新的Basier路径S2,并将S2绑定给第二条鱼,以此类推,最终给此鱼群中所有的鱼都绑定合适的路径,从而保证了这些鱼运动是无序的但大方向都是一致的。如图6是两条鱼组成的散漫鱼群示意图,其中只有一条路径是编辑器编辑生成的,另外的路径是程序通过微微平移各控制点生成的。显然这种方法在没有额外增加路径编辑量,节约磁盘内存空间的同时,实现了比较随意的运动效果。

2.2.4 鱼动画系统在应用时的注意事项

从所有预先编辑好的路径中选择一条绑定到鱼身上需要注意如下几点:

1) 要对类选择。不同种类的鱼要从为本类鱼预先设计的路径中选择,因为在预先编辑路径时已经考虑了不同的鱼类的运动习性,例如为大鲨鱼设计的路径将比较直,不会出现很陡的转弯,而为小河豚设计的路径就比较灵活,可以有急速弯道。所以在选择时需要在各自类型的鱼所对应的那些路径中进行选择。

2) 要注意屏幕上鱼的分布的均衡性[5]。为此,在编辑器中进行路径设计时,我们就保存了各条路径的一些区域特性,比如从哪里出来,到哪里去,主要经过的炮位有哪些等等,在游戏运行时我们实时统计当前屏幕内各区域内的鱼的总量,为路径的选择判定提供依据。

3) 注意路径的丰富性,在屏幕上尽量不要出现多条鱼选择同一条路径的情形,除非是成队的或成群的鱼群。为此我们为每条路径都定义了“使用量”这样的变量,仅在该路径当前使用量为0时才选用并绑定。而在鱼被击毙或者游出屏幕后立刻对其身上绑定的路径的使用量进行更新。

另外,屏幕上出哪一种鱼也需要进行合理控制,如果某一种鱼太多显然会影响游戏观赏性。同时大小鱼的出现比例也应该要比较协调,为此我们为每种鱼都设置了出现条数的上限,同时设置了鱼类过滤器,保证了出鱼的均衡合理性。所有创建的鱼都放入鱼的队列中。

2.3 碰撞检测模块设计与优化

根据游戏规则,按发炮键会从炮口发出炮弹。炮弹运动过程中如果与鱼有碰撞则会炸开成网,所以在炮弹和鱼之间需要进行实时碰撞检测[6-8]。碰撞检测也可以借助于BOX2D等第三方的物理模块来实现,但是由于此类街机游戏对于碰撞检测的精度要求不高,所以我们并未借助于专门的物理引擎,而是自己进行轻量级的实现。

由于游戏场景空间可以划分为几个区域,游戏屏幕内、游戏屏幕外虚拟屏幕内、虚拟屏幕外。根据路径设计原则,鱼在刚产生的时候在屏幕外虚拟屏幕内,根据其运动情况来更新其状态。击毙的和游出虚拟屏幕的鱼要及时清除,只有那些在屏幕内的鱼才需要与炮弹进行碰撞检测。

具体碰撞检测过程中,我们先进行基于AABB包围盒的初步检测[9],如果确实有碰撞可能,再进行基于包围球的碰撞检测,这里不论包围盒还是包围球其参数都是根据鱼图片来计算确定的,从而在一定程度上可以提高精度,但是为了进一步提高精度,我们对每种鱼的碰撞球半径都进行了人工指定,使得其更加符合每条鱼的具体情况,特别是对于气球鱼等可变大小的鱼则根据实际情况动态指定其碰撞球半径,使得运行结果更加真实。由于基于AABB包围盒的碰撞检测只有加减运算,基于包围球的碰撞检测有乘法运算,因此这种策略可以最大程度的减低碰撞检测的计算量。当然这种方法的弊端是得到的碰撞结果仍然不够精确,特别是对于那些具有长条形状的大鱼(如图7) ,这些大鱼如果精度太差(例如明显已经碰上的没有检测出来,显然没有碰撞的却检测为已发生碰撞)就会严重影响玩家感受。因此有必要对这些鱼进行精细化处理。显然OBB方法会得到更高的精度,而基于不规则形状物体的碰撞检测则会得到最精确的碰撞结果,但是这些方法不但实现比较复杂,而且都会导致过高的计算开销。最终我们设计了一种基于连环碰撞球的方法(如图7) 。对于那些大鱼将根据情况绑定2~3个碰撞球,通过所有碰撞球与炮弹的碰撞检测来判断鱼是否与炮弹发生了碰撞,这种方法需要获取朝向,并计算出两个球的球心,然后进行两次基于球的碰撞检测,计算量稍高于现有方案。但实际测试结果表明,这种策略大大提高了真实感,且在我们的工业主机上运行时,在屏幕炮弹不超过200发同时屏幕上鱼不超过100条的情况下,是可以满足50fps的要求的。

2.4 特效模块设计

为了提升游戏效果,我们最初基于HGE自带的粒子系统编辑器,完成了一些初级的粒子效果,但是效果始终无法满足要求。为此我们最终引进了Pyro粒子系统,该粒子系统是第三方机构开发的适用于各种渲染平台(包括HGE)的一套粒子系统,分为引擎库和编辑器两部分。基于此,我们完成了更加绚丽的粒子系统设计,并融入了我们的游戏中。具体流程为:

1) 在预处理阶段,进行特效编辑,保存成特效文件;

2) 游戏初始化时载入特效文件生成特效对象;

3) 在游戏逻辑过程中需要的时候,在指定的地点激发特效对象。

2.5 其他优化技巧

在游戏绘制过程中,对那些真实屏幕之外的鱼的绘制毫无意义,而且会增加显卡负担,因此在遍历鱼队列进行绘制前,需要先判断鱼的状态,只有那些在屏幕内可见的鱼才真正调用绘制函数。这样提高了本游戏的渲染效率。

另外,游戏中采用了多线程来进行优化。例如在场景切换瞬间因为要加载大量图片数据而会导致CPU负载太大,出现1秒左右的卡顿,我们将待切换场景图片、海浪图片的加载提前到场景切换的时间点之前,并用专门的线程来完成,避免了卡顿现象。另外在多人同时发炮时,需要同时播放多个发炮音效,如果都放在主进程中,会导致主逻辑循环在发炮瞬间降到10fps以下。为此,最终游戏中是将声音的播放都放在一个播放线程中,解决了由于声音播放负荷过大而导致的游戏画面表现卡顿现象。

3 结束语

最终,我们按照上述开发方法和技巧完成了整个游戏系统的开发,并在工业主机上运行,如下是游戏截图(图8) 。在将屏幕上的空炮弹数限定在100发以内的情况下,当屏幕上鱼数达到80,且在屏幕上同时播放8个粒子特效的情况下,帧率也可以达到60fps以上,画面流畅,整体效果良好。

参考文献:

[1] 赵大伟,肖周芳,张艳.浅谈2D游戏的一些技术方法[J].科技信息,2008(30):81-82.

[2] 高凌琴,陈青华.俄罗斯方块游戏关键技术探讨[J].信息技术与信息化,2008(2):69-71.

[3] 郑勇,刘乃琦.BREW手机赛车游戏若干技术难点及实现[J].成都信息工程学院学报,2006(2).

[4] 黄蓝枭.游戏引擎效的实时渲染技术研究[D].成都:电子科技大学,2008.

[5] 李博.游戏人工智能关键技术的研究[D].上海:上海交通大学,2011.

[6] Van den Bergen G.Efficient collision detection of complex deformable models using AABB trees[J].Journal of Graphic Tools,1997,2(4):1-13.

[7] 王志强,洪嘉振,杨辉.碰撞检测问题研究综述[J].软件学报,1999,10(5):545-551.

[8] 张帆,潘瑞芳,叶福军,等.视频游戏中碰撞检测算法的选择[J].电脑知识与技术,2011,7(13):3136-3137.

[9] 陈学文,丑武胜,刘静华,等.基于包围盒的碰撞检测算法研究[J].计算机工程与应用,2005,41(5):46-50.

上一篇:高职《网络安全》课程项目进阶体验式教学模式... 下一篇:数据结构课程建设与改革实践