背景
假如场景中存在大量的对象,需要快速找到某个范围内的所有对象,如果通过传统的方式,就需要对所有的物体遍历,依次判断是否在范围中,这样非常耗时。所以通过空间划分的方法将其加速,本文中采用四叉树的方式,从实现思想和代码层面对效率进行分析。
思想
在空间划分算法中首先需要对所有的对象进行维护,按照某种方式存放起来,也就是插入(Insert),之后再进行搜索(Query)。
在插入前首先需要规定这个树最大的深度maxDepth,这里为画图方便,设定为3层,当到达最深的层,则不再划分。
插入
对于每个对象,都执行以下的插入操作:
(1)首先将一个物体放入一个定义了边界的空间,如果这个物体和该空间有重叠,则执行插入。
(2)在插入前,如果当前层没有到达最深的层,将该区域划分成四个子区域。
(3)对每个子区域,都递归地执行一遍(1)。
(4)重复(1)(2)(3)。
压线处理
假如物体和某层的划分线重叠了,一般有两种处理方式。
-
方式1:由两个子区域分别维护,这样的缺点是比较浪费内存空间。
-
方式2:由当前层维护,不插入到子区域。
搜索
实现
假如场景中存在1000个对象,每个对象都是一个逻辑实体,会在每帧和周围半径内的其他对象进行交互判断。那么在传统方式下,每个对象都要去依次遍历其他的所有对象,判断它们是否落在自己的半径内,这样需要花费O(n²)的时间,非常耗时。所以本文通过