AOI的实现的优化过程

来源:互联网 发布:网络摄像头代理 编辑:程序博客网 时间:2024/05/10 14:21
由于正在开发的游戏涉及到10万个移动角色,如果单服10000玩家的话,采用双向循环查找,那就是10亿的量级,太恐怖了,不得不对算法做优化。
考虑以下场景:
1000*1000的地图
10000客户端角色
两个角色间的距离是10时,有效。
使用语言:java,版本1.6

随机生成10000角色的位置信息,然后计算哪些角色的信息需要发给范围内的客户端。
原始:使用最简单的双向查找算法,两重For循环, 每找到一个时数量+1,结果如下
    找到40030个有效值,耗时880ms
优化一:很明显,位置是双向的, 也就是A在B的范围内,B也在A的范围内,因此只需要循环n*(n-1)/2次,优化结果耗时416ms

优化二:由于大部分的角色位置相距较远,因此对地图进行分区,以100为单位,整个地图被分成100个区域,创建区域数组Player[100][],然后计算每个客户端的更新范围所在的区域, 并将客户端加入到区域中,注意客户端的四个顶点可能在不同的区域上, 此时在几个区域就要加入几个区域。最后计算角色所在区域,并和区域内的Player计算距离。此算法得到的结果是22.5ms,为了避免java计时精度问题的影响,此处用了nanotime来计时。

优化三:区域大小用2^N来表示,从而在计算角色所在区域时可以用移位来处理,使用64作为区域大小,优化后平均耗时是:15.5ms

优化四:从算法的耗时来看,区域小一些,则区域数量变多,但每个区域内的角色数量就少了,需要计算的量也会变少,使用32作为区域大小后,耗时为:9.5ms

优化五:如果地图变大一些,角色更加稀疏,则计算量会更少,使用10000*10000的地图后, 同样64大小的区域,耗时是:1.8ms

自此,整个优化结束,基本满足需要。
原创粉丝点击