【问题标题】:Box2d raycast vs AABB query performanceBox2d 光线投射与 AABB 查询性能
【发布时间】:2015-10-04 11:02:47
【问题描述】:

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

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

【问题讨论】:

标签: performance box2d raycasting aabb box2dlights


【解决方案1】:

您确实应该至少以粗略的方式确定您是否真的需要添加 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's World Querying

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

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

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

【讨论】:

  • 非常感谢您详尽的回答!在我的问题中,我的意思是只做一个 AABB 来检查是否有任何 x 射线投射可能返回命中,但我没有明确说明这一点。无论如何,你是对的,在大多数情况下,AABB 会在大多数环境(包括我的环境)中返回命中,所以它确实不是很有帮助。
猜你喜欢
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 2016-08-09
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
  • 1970-01-01
相关资源
最近更新 更多