跳到主要内容
← 全部概念
性能优化 / 30

空间划分

只检查附近的物体

交互演示

交互演示 · 移动指针或点击画面,观察变化

检查所有物体两两之间的碰撞,成本会随物体数量的平方增长。这里的 48 个物体每帧需要 1,128 次检查,1,000 个物体则大约需要 500,000 次。空间网格按位置把物体分配到网格单元中,每个物体只与自己所在单元及相邻单元中的物体进行检测;在这里,只需约 100 次检查,就能找出同样的重叠。

适用场景

使用网格或树结构缩小邻域查询和碰撞查询的范围。单元尺寸应结合物体尺寸与查询半径决定,没有一个尺寸适合所有游戏。

实现示例

不依赖特定引擎的伪代码。请根据你使用的引擎调整函数和坐标约定。

cell = floor(position / cellSize)
grid[cell].add(object)
for neighborCell in cellsOverlapping(queryBounds):
  for candidate in grid[neighborCell]:
    runExactTest(candidate)

常见错误

网格用于粗筛,并不等于碰撞检测本身。要考虑跨越多个单元的物体,并在精确检测阶段之前,对候选物体对去重。

内容原作 Nicolas Zullo · 中文整理与交互改编