2013-05-13 122 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