【问题标题】:How to Optimize Object Collision Check in games?如何优化游戏中的对象碰撞检查?
【发布时间】:2014-11-10 18:17:14
【问题描述】:

在我的游戏中,ObjectManager 类管理我游戏的所有对象,它有一个对象列表。

当我检查每个对象的碰撞时,我使用 2 for 语句。

for(int i = 0; i < objectnum; ++i )
{
  for(int j = 0; j < objectnum; ++j)
  {
    AABB_CollisionCheck()
  }
}

但如果游戏中有很多物体,FPS 会变低。 (80 个对象 == 40 帧) 也许这是因为我的碰撞检查方法效率低下。 (如果对象 num 是 n ,那么我的方法运行 n^2 次)

  1. 您能给我一些有关此碰撞检查优化的提示吗?

我想减少我的 for 循环来检查每个对象碰撞。

  1. 使用或不使用回调函数有什么不同?用于碰撞检查。 Callback 有什么运行速度的冒险吗?




附言 非常感谢您阅读我的问题。请原谅我的英语水平......

【问题讨论】:

  • 如果您已经检查过A是否与B发生冲突,则不必检查B是否与A发生冲突。
  • 最明显的改进是从i + 1 运行第二个循环。在那之后,您可能想查看碰撞代码,如果没有帮助,请查看一些空间分区方案。分析器是一个很好的帮助。
  • @Blutkoete,我也建议这样的代码:for (int i = 0; i &lt; objectnum - 1; ++i) for (int j = i + 1; j &lt; objectnum; ++j)

标签: c++


【解决方案1】:

通常情况下,了解一些额外的词汇有助于在这里找到丰富的信息。您正在寻找的被称为碰撞检测的广泛阶段,这是任何可以防止您必须查看每对对象并因此有望避免 n^2 复杂性的方法。

一种流行的方法是空间散列,您可以将空间细分为单元格网格,并将每个对象分配给包含它的单元格。然后,您只需将每个单元格中的对象与该单元格和相邻单元格中的其他对象进行比较。

另一种方法称为Sweep and Prune,它利用对象通常不会从一帧到下一帧移动太多这一事实。

您可以在这个问题中找到更多信息:Broad-phase collision detection methods?

【讨论】:

    【解决方案2】:
    1. 您能给我一些有关此碰撞检查优化的提示吗?

    首先你可以尝试优化你的第二个循环:

    for (int i = 0; i < objectnum; i++)
    {
      for (int j = i+1; j < objectnum; j++)
      {
        AABB_collisioncheck();
      }
    }
    

    这只会以一种方式检查碰撞,比如 A 碰撞 B,然后你不会触发 B 碰撞 A。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多