5

我目前正在尝试提高使用 box2d 物理(实际上是 box2dlights)的游戏的性能。

我有一种方法可以在已知区域内制作多个(比如说大约 16 到 64 个)光线投射。我想知道在第一步中对该区域进行 AABB 查询是否是个好主意,以检查光线投射是否可以报告某些内容。如果没有,我可以跳过光线投射。但是,如果 AABB 查询找到了一些东西,我必须进行光线投射,并且查询是多余的。AABB 查询与 raycast 相比有多快(尤其是在 box2d 中)?如果我可以依次跳过一些光线投射,那么进行通常多余的 AABB 查询是否是个好主意?

4

1 回答 1

2

您确实应该至少以粗略的方式确定您是否真的需要添加 AABB 测试阶段。

听起来您实际上是在将光线投射用于照明目的。确实有理由认为,如果是这种情况,大多数时候你的光线投射实际上会相交。您的环境可能会有一个外部边界。这意味着您在这样的环境中实施的 AABB 测试很可能会在大部分时间(如果不是一直)相交。

此外,还考虑到光线投射以径向方式执行以用于 2D 照明的假设,从中心位置开始的光线的 AABB 在某种意义上是退化的,因为每条光线(光线的长度是无限的)将导致 4 种可能的 AABB 之一:

x=0, y=0, x -> infinity  y -> infinity
x=0, y=0, x -> infinity  y -> -infinity
x=0, y=0, x -> -infinity y -> infinity
x=0, y=0, x -> -infinity y -> -infinity

如果您进行射线投射,例如 64 条径向等距射线并天真地执行 64 次 AABB 检查(每个射线投射一个),那将是浪费时间,例如,具有正 x 和正 y 方向的所有 16 条射线都将解析为相同的 AABB检查(上面列出的第一个)。

你可以做一些事情,比如总是执行这 4 次 AABB 检查,如果其中一个没有与任何东西相交,那么你可以跳过 16 次射线投射。但这只有在你一直走到环境边缘时才会发生。

AABB 不太适合加速光线投射,因为只有接近与轴对齐的光线才会被 AABB(轴对齐边界框)很好地建模。


还存在另一种思维过程,它可以向您表明 AABB 测试不太可能有帮助。

使用 Box2D 执行光线投射的目的是因为该库提供了复杂的机制来为您加速光线投射。参见iforce2d 的 World Querying

Box2D 为[世界查询] 提供了两个工具——射线投射和 AABB 测试。射线投射……我们不就是这样做的吗?是的,我们以手动方式完成了这项工作,循环遍历世界上的每个灯具,并检查所有灯具的光线,以找出最接近的灯具。当场景中有大量灯具时,这可能会非常低效。更好的方法是使用世界本身的 RayCast 功能。这允许引擎专注于它知道在光线路径附近的固定装置。

该库将使用其内置的世界空间表示及其内置的加速结构来为您确定特定射线将与哪些物体相交。这实际上是 box2dlights 自己存在的理由。

因此,使用 AABB(Box2D 提供的另一种世界查询)来尝试增强它是没有意义的。如果这确实是一件明智的事情,那么 Box2D 已经在 raycast 功能的引擎盖下为您做到了。

于 2019-09-05T05:22:40.223 回答