Box2d 光线投射与 AABB 查询性能

Box2d raycast vs AABB query performance

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

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

您确实应该至少以粗略的方式确定您是否真的需要添加 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 检查(每个光线投射一次),例如,所有 16 条具有正 x 和正 y 方向的光线将解析为相同的 AABB 检查(上面列出的第一个)。

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

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


还有一种替代思维过程可以告诉您 AABB 测试不太可能有帮助。

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

Box2D provides two tools for [world querying] - ray casting and AABB testing. Ray casting... didn't we just do that? Yes, we did it the manual way, by looping through every fixture in the world and checking the ray against them all to find out which one was the closest. This can be very inefficient when you have a large number of fixtures in the scene. A better way is to use the RayCast function of the world itself. This allows the engine to focus on fixtures which it knows are near the ray's path.

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

因此,没有必要使用 AABB(Box2D 提供的另一种世界查询)来尝试增强它。如果这确实是一件明智的事情,那么 Box2D 已经在光线投射函数中为您完成了。