performance - Box2d raycast 与 AABB 查询性能

标签 performance box2d raycasting aabb box2dlights

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

我有一种方法可以在已知区域内进行多次(假设大约 16 到 64 个)光线转换。我想知道第一步对该区域进行 AABB 查询以检查光线转换是否可以报告某些内容是否是一个好主意。如果没有,我可以跳过光线转换。但如果 AABB 查询找到了一些东西,我就必须进行光线广播,并且查询是多余的。与光线转换相比,AABB 查询有多快(尤其是在 box2d 中)?如果我可以依次跳过一些光线转换,那么进行通常多余的 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 检查(每个光线转换一次),例如,具有正 x 和正 y 方向的所有 16 条光线都将解析为相同的 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 已经在光线转换函数的幕后为您做到了这一点。

关于performance - Box2d raycast 与 AABB 查询性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32932749/

相关文章:

python - 在 python 中加速 int 列表到二进制的转换

java - 如何在 NetBeans 中安装 jBox2d?

c# - 检查射线是否击中立方体

Java实时性能

sql - 使用临时表复制一行的开销值得吗?

java - 如何限制动态体不互相反弹(但仍然碰撞)?

ios - Box2D 碰撞检测?

c++ - 鼠标悬停时 GLSL 高亮网格

c++ - 为什么我在所有像素的双 for 循环中使用 SDL2 和 SDL_RenderCopy 时性能不佳?

c# - 如何最大化 http.sys 文件上传性能