← 全部概念
性能优化 / 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 · 中文整理与交互改编