2015-02-11 89 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)的,这使得它真正更快。