艺虎动画 > flash游戏优化之四叉树

flash游戏优化之四叉树

翼虎动漫   2010-9-19

 

 

 

四叉树 (QuadTrees)可以说是2叉树的扩展形式。

为什么在游戏中我们要用4叉树代替一般的遍历查找呢?它的优越性主要在于能在大规模对象队列中快速的查找到你想要的内容,而他的消耗却跟对象数的数目没有太直接的关系;

如图,你可以看到,如果在程序中通过遍历查找对象,那是相当消耗资源的,而且会随着数目的增加而呈正比例消耗;但4叉树则不同,他通过预先建树的过程把对象整理到一个完整的树状结构中去。查询的时候只要根据要求的范围,通过遍历树节点的方法即可得到想要的数据,快速而简洁。

可能很多人会认为4叉树只适用于静态搜索,对于动态四叉树效率则要相对减慢,本人起初也是这样的想法,但经过验证发现,确实如果你每次都重新遍历树的话,那消耗绝对是要比遍历慢的,但是如果方法得当,像我上图的就是一个动态四叉树,叉用的方法是覆写x跟y的设置,在赋值时验证树状结构是否发生变化,这这样做的好处是我们只需要很小的消耗即可完成修正过程,效率上可以说没有太大改变。

下边说说4叉树的大致原理:

首先我们以屏幕中心将区域等分成4等分,然后以这4个区间(红线区间)分支点把在各自区间的对象添加到对应支点的哈希表里边;然后再分别对这4个区间各自进行4等分,重复上边的步骤,(黄线区间),然后在如此类推,一般说只要进行5-6个层级的等分足以分到1像素大小左右了,这个过程称之为建树;建树完毕接下来就是用树;

为什么说4叉树遍历快就在于刚才我们的建树过程已经将对象划分到各个支点中去了,剩下的我们只要根据一个搜索区域或者以及一个精确度即可通过递归的方式遍历与搜索区域相交的区间的节点即可。

比方说搜索区域只与第一区间相交,那么就意味之我们只需要遍历第一个区间的节点即可,那样我们就相当于剩下了其他3个区间对象的遍历了,这就是4叉树快的原因所在,而且他不跟对象数目直接相关,它只在乎建树时的区间等级树。

想我们做游戏场景一般都只会在5000*5000的范围内,这样的大小对于四叉树来说只要6层左右就可以完成建树过程了,但搜索的过程确实那么的快速、高效。

下边是演示文件:

http://filer.blogbus.com/1587898/resource_158789812690578840.rar

四叉树在游戏中要我们可以应用于:渲染面积,怪物的搜索ai,及数据搜索,条件剔除,深度排序等...