Seb*_*ian 5 performance box2d aabb raycasting box2dlights
我目前正在尝试提高使用 box2d 物理(实际上是 box2dlights)的游戏的性能。
我有一种方法可以在已知区域内进行多次(假设大约 16 到 64 次)光线投射。我想知道在第一步中对该区域进行 AABB 查询以检查光线投射是否可以报告某些内容是否是个好主意。如果没有,我可以跳过光线投射。但是如果 AABB 查询找到了一些东西,我必须进行光线投射并且查询是多余的。与光线投射(尤其是在 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
Run Code Online (Sandbox Code Playgroud)
如果您进行光线投射(例如 64 条径向等距光线)并天真地执行 64 次 AABB 检查(每个光线投射一次),那将是相当浪费时间,因为例如所有具有正 x 和正 y 方向的 16 条光线将解析为相同的 AABB检查(上面列出的第一个)。
您可以执行类似始终执行 4 次 AABB 检查之类的操作,如果其中之一不与任何内容相交,那么您可以跳过 16 次光线投射。但这只有在您一直走到环境边缘时才会发生。
AABB 不太适合加速光线投射,因为只有接近与轴对齐的光线才能通过 AABB(轴对齐边界框)进行良好建模。
还存在另一种思维过程,可以向您表明 AABB 测试不太可能有帮助。
使用 Box2D 执行光线投射的目的是因为该库提供了复杂的机制来为您加速光线投射。从iforce2d的世界查询中看到:
Box2D 提供了两种用于【世界查询】的工具 - 射线投射和 AABB 测试。光线投射……我们刚才不是就这么做了吗?是的,我们以手动方式做到了这一点,通过循环遍历世界上的每个装置并对照它们检查光线以找出最接近的一个。当场景中有大量灯具时,这可能非常低效。更好的方法是使用世界本身的 RayCast 功能。这使得引擎能够专注于它知道靠近光线路径的固定装置。
该库将使用其内置的世界空间表示及其内置的加速结构来为您计算出特定射线将与哪些物体相交。这实际上是 box2dlights 自己存在的理由。
因此,使用 AABB(Box2D 提供的另一种类型的世界查询)来尝试增强它是没有意义的。如果这确实是明智之举,那么 Box2D 已经在光线投射函数的幕后为您做到了这一点。
| 归档时间: |
|
| 查看次数: |
752 次 |
| 最近记录: |