1.引子
在一张地图上,有600多个单位,每个单位之间都需要独立寻路,检测碰撞和寻找最近的敌方目标。当这一切需要在手机上流畅运行并尽可能快的在服务器进行模拟时,最简单的平方算法O(N^2)已经不能满足需求。
怎样减少计算的复杂度呢?
通过观察,可以发现,在地图左上角的单位根本无需和地图右下角的单位进行碰撞检测,因为它们离的太远了。
所以,通过对战场进行空间划分,可以避免大量的无效计算。
一种简单的划分方法是,将战场沿着横纵坐标划分为N * N的格子,只对在相同格子内的战斗单元做碰撞检测。
这种方法在大部分情况下简单有效,然而有以下几点问题:
1.当格子边长太大时,假设很多单位都聚集于一个或少数几个格子中,其实空间并没有有效划分
2.当格子边长太小时,一个格子内的单位可能太少了,也不能对空间进行有效划分
3.如果不查找附近的几个格子,可能或错过附近格子可能距离更近的单位
4.这种方法的空间复杂度是O(N2),在格子数很多的情况下,内存开销会很高
KD树k — dimensionaltree,也可称之为K维树,可以用更高的效率来对空间进行划分,并且其结构非常适合寻找最近邻居和碰撞检测。