我目前正在尝试提高使用box2d物理(实际上是box2dlights)的游戏的性能。
我有一种方法可以在已知区域内制作几个(比如说大约16到64个)光线投射。我想知道在第一步中对该区域进行AABB查询是否是一个好主意,以检查光线投射是否可以报告。如果没有,我可以跳过光线投射。但是,如果AABB查询找到了我必须制作光线投影的内容,并且查询是多余的。 AABB查询与光线投射相比有多快(特别是在box2d中)?如果我可以轮流跳过一些光线投射,那么制作一个经常多余的AABB查询是一个好主意吗?
答案 0 :(得分: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个ABB检查(每个射线广播一个),例如,具有正x方向和正y方向的所有16条射线都将分解为相同的ABB检查(上面列出的第一个)。
您可以执行类似始终执行这4项AABB检查的操作,如果其中一项没有相交,则可以跳过16条射线广播。但这只有在您一直走到环境边缘时才会发生。
AABB并非绝对适合加速射线广播,因为只有接近于与轴对齐的光线才会被ABB(轴对齐的边界框)很好地建模。
还存在另一种思考过程,该过程可以向您表明AABB考试可能无济于事。
使用Box2D进行射线广播的目的是因为该库提供了完善的机制来为您加速射线广播。从iforce2d's World Querying看:
Box2D为[世界查询]提供了两个工具-射线投射和AABB测试。射线投射...我们不只是这样做吗?是的,我们通过手动遍历世界上的每个灯具并检查它们对着它们的光线以找出最接近的灯具来手动完成。当场景中有大量灯具时,这可能会非常低效。更好的方法是使用世界本身的RayCast功能。这样,引擎就可以将注意力集中在光线路径附近的固定装置上。
该库将使用其内置的世界空间表示法及其内置的加速结构为您确定特定射线将与哪些物体相交。这实际上是box2dlights自己的理由。
因此,使用AABB(Box2D提供的另一种世界查询)来增强它是没有目的的。如果确实这样做是明智的,那么Box2D已经在光线投射功能的幕后为您做到了。