我目前正在努力提高一个利用box2d物理(实际上是box2dlights)的游戏的性能。
我有一种方法,在一个已知的区域内做几个(比方说大约16到64)射线投射。我想知道,作为第一步,对该地区进行AABB查询是否是一个好主意,以检查是否有射线广播可以报告的内容。如果没有,我可以跳过光线投射。但是,如果AABB查询找到了什么,我必须进行光线投射,而查询是多余的。与射线广播(特别是在box2d中)相比,AABB查询的速度有多快?如果我可以依次跳过一些raycast,那么做一个经常多余的AABB查询是个好主意吗?
发布于 2019-09-05 05:22:40
你真的应该确定,至少在信封背面的方式,你是否真的需要增加一个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执行raycast的目的是因为该库提供了复杂的机制来加速光线投射。从Iforce2d的世界查询看
Box2D提供了两种用于世界查询的工具-射线铸造和AABB测试.光线投射..。我们不是刚这么做了吗?是的,我们是用手动的方式做的,通过循环遍历世界上的每一种固定装置,并检查射线与它们的关系,找出哪一种是最近的。这可能是非常低效的,当你有大量的固定装置在现场。更好的方法是使用世界本身的RayCast函数。这使得引擎能够聚焦在光线路径附近的固定装置上。
这个图书馆将使用它内置的空间表示世界和它内置的加速结构,为你找出一个特定射线将与哪些物体相交。这实际上是box2dlights自己的理由。
正因为如此,使用AABB( Box2D提供的另一种类型的世界查询)来增强它是没有意义的。如果这确实是一件明智的事情,那么Box2D已经在光线投射功能下为您做了。
https://stackoverflow.com/questions/32932749
复制相似问题