2013-05-13 89 views
2

我一直在研究一个简单的太空射击游戏,并且已经到了项目中我写得很糟糕的代码实际上正在放慢速度。在运行EQATEC之后,我可以看到大部分问题都在检查碰撞检测中的一切。我正在考虑投入QuadTree,但大多数碰撞都在小行星上,这些小行星的确有很多变化(需要大量更新)。我的下一个选择是微观优化碰撞检查本身。这是它:C#/ XNA - 边界圆碰撞(微)优化?

public bool IsCircleColliding(GameObject obj) //simple bounding circle collision detection check 
    { 
     float distance = Vector2.Distance(this.WorldCenter, obj.WorldCenter); 
     int totalradii = CollisionRadius + obj.CollisionRadius; 

     if (distance < totalradii) 
      return true; 
     return false; 
    } 

我听说Vector2.Distance涉及昂贵的Sqrt,所以有什么办法可以避免这种情况吗?或者有没有办法通过一些奇特的计算来近似距离?任何更快的速度,本质上。

此外,与实际问题略有无关,是否有一种很好的方法(QuadTrees除外)用于快速移动对象的空间分区?

回答

1

计算距离的平方而不是实际距离,并将其与碰撞阈值的平方进行比较。这应该快一点。如果大多数小行星的大小相同,则可以重新使用相同的值作为碰撞阈值,而无需重新计算它。

另一个有用的技巧是首先基于边界框进行简单的检查,并且仅当边界框相交时才计算距离。如果他们不这样做,那么你知道(便宜)两个物体不会碰撞。

+0

好吧,用DistanceSquared替换Vector2.Distance,并将每个半径乘以它自己,现在碰撞半径似乎被击晕了;一切似乎都陷入彼此之中。我会用断点玩一下。 :P – Lexusjjss 2013-05-13 22:49:46

+1

你必须平方totalradii,而不是每个半径单独。 – redtuna 2013-05-13 22:54:02

+1

Aaa现在可以工作。那么,这让我感觉像一个愚蠢的人。谢谢。 – Lexusjjss 2013-05-13 22:55:29