为何要对场景进行区域划分,这个同样是为了优化碰撞检测。因为相对于其他逻辑而言碰撞检测尤其消耗性能,尤其是对网格类的碰撞体进行碰撞检测时性能开销更大。
试想一下场景中有1000个物体 如果没有区域划分的情况,物体两两碰撞检测的次数是 1000 * 1000次,
而如果游戏帧率达到60,那么这个碰撞检测逻辑就达到了 1000 * 1000 * 60次,
而即时采用优化的机制,因为当一个物体与场景中其他物体碰撞之后,可以不再参与后面的碰撞检测。那么次数是(1000 + 999 + 998 + ...+ 1 )* 60 = (1000 * 999) / 2 * 60
如果我们将场景中的物体平均分配到 16个区域中, 当物体的大小不超过区域大小的时候,通常我们只需要和所在区域内的物体进行碰撞检测。理想情况 1000个物体分配到16个区域 ,每个区域中有 62 个物体
碰撞检测次数为 62 * 62 * 60 * 16 = 369 0240次
相比于 1000 * 1000 * 60 = 6000 0000次 可以节省 5630 9760次,大大减少了碰撞检测的总次数。
需要注意的是 处理区域边界问题,另外需要保证场景中最大的物体的大小不能够超过一个区域的大小。这样实际情况中最坏的情况是一个物体处于边界时可能同时在 4个区域中