2015-02-11 65 views
-1

這是我目前如何檢查碰撞我的瓦片地圖:哪個更有效率:循環遍歷int [,]兩次,還是循環遍歷一次?

int[,] layer; 

for (x = 0; ...) 
{ 
    for (y = 0; ...) 
    { 
     //Do collision checks here, based on index. 
    } 
} 

這是我想到的選擇:

List<Collision> collisions; 

for (i = 0; i < collisions.Count; i++) 
{ 
    //Check for "MovingObject to Collision" here. 
} 

我會假設,因爲我從兩個for開關循環到一個,它會更快。

  1. 性能方面,這與我通過for循環進行迭代有什麼關係嗎?
  2. 出於好奇,我在foreach循環中迭代的內容是否重要?
+0

循環在一個循環內有一個複雜的** O(n^2)**循環一次有** O(n)** **。但這兩個代碼又是如何相互關聯的呢? – 2015-02-11 04:28:05

+0

由於兩種情況下的內碼不相同,因此無法確定。 – NoChance 2015-02-11 04:31:57

+1

運行代碼最有效,並在需要時進行優化。 – SimpleVar 2015-02-11 04:38:29

回答

1

這兩個循環將花費(幾乎)同一時間。假設大多數CPU週期是循環內部計算所需要的(在你的情況下進行碰撞檢查),循環本身的週期(增量x,y)可以忽略不計。

在您的for(x)/for(y)檢測中,計算是執行Length(x) * Length(y)次。在for(collisions)中,您必須檢查相同的碰撞次數。如果您嘗試測試兩個循環的性能,將很難看到任何區別。

第二種方法將允許更加優雅但是:

foreach(var collision in collisions) ... 

循環的數目是(幾乎)相同的用for(i)循環。 (不可測的差異...)

像往常一樣的伎倆來獲得更快的算法中的變化:

  • 是否有任何的可能性來檢查的對象,衝突的數量有限?
  • 任何機會使用排序對象列表,例如先檢查近鄰鄰居?

這可能你的算法,從爲O(n^2)更改爲O(N)甚至O(log n)的,這使得它真正更快。