哪个更高效:遍历 int[] 两次,还是遍历 class 一次?

Which is More Efficient: Looping through int[,] twice, or looping through class once?

这是我目前检查瓦片地图碰撞的方式:

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 循环中迭代的内容重要吗?

两个循环将花费(几乎)相同的时间。假设循环内的计算需要大多数 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),这使得它确实快很多