int [,]数组与字典的效率<>用于不断更新

时间:2016-01-15 15:31:51

标签: c# .net arrays performance unity3d

我在C#中创建了Unity中的一个游戏空间(这只是一点点相关),表面上是.NET,因为它在Unity中。游戏空间是二维的,并且通过细胞自动机产生,其具有使得游戏空间的形状可用的细化自动化"为了我的意图。

目前,关于基本游戏空间(活细胞或死亡,开放或封闭,通路或墙壁)的数据作为二进制值存储在int[,]阵列中。最终,其他数据也将存储在数组中,或者可能存储在映射回int[,]数组的辅助集合中。

其他数据将包含以下内容的信息:玩家是否访问过此单元格,玩家当前是否可以看到此单元格(LoS),此单元格中是否有敌人或物品/物品。

LoS,hasVisited和敌方数据将是动态的,显然,当玩家导航并且敌人沿着他们的路径移动时。

我想从头开始设计和开发性能,因为早期的失误可能会导致性能瓶颈,这可能需要进行大量重构 - 在项目结束时浪费宝贵的开发时间。

我的问题是:

更新数组或多个数组以跟踪数据是否会以线性或指数方式变得资源昂贵?换句话说,如果mapA是[80,80]而mapB是[160,160],那么mapB将消耗大约4倍的资源来维护,或者某些更大或更小的数量?如果大小超过int[,]的某个值,使用词典或自定义集合是否有好处?

我最初的想法是使用像Dictionary<int[,], Dictionary<string, string>>这样的东西。我在工作中维护的实用程序中使用的字典非常广泛,但性能是我不会考虑的,因为它是内部的,非常特定于用途,因此我并不十分熟悉一般来说Dictionary<>的表现。使用不同数据的同一网格的多个数组对Dictionary的好处是我可以使用有意义的键,而不仅仅是需要跟踪的其他值。但是,我怀疑数组可能只是更快,而从长远来看可读性较差。

谢谢!

3 个答案:

答案 0 :(得分:3)

根据this answer,Dictionary在内部是一个struct数组。因此,您只需添加一个额外的图层,而不是简单地将它们存储在您自己的多维数组中。如果您正在寻找微优化,那么您将永远无法通过在其上堆积更多数据来击败阵列。

此外,int[,]至少有助于提高可读性,因为它准确地表示了数据的可视化显示方式。首先,确保在进行之前需要进行优化。首先考虑过早优化的可读性。

我会坚持使用int[,]来做你正在做的事情。它将具有更好的性能和可读性。

答案 1 :(得分:0)

这可能取决于游戏空间的大小以及它的稀疏程度,但我会考虑使用字典或其他一些托管结构。

如果你有一个1000x1000的游戏空间并且你使用一个阵列,它将产生1,000,000个阵列单元,即使你只“访问”了10%的阵列单元。字典方法将使用内部数组,但只有在需要时才会增长,并且开始时会相当小。说10x10(不确定,必须检查)。

我假设访问空间的百分比可能远低于100%。字典将保持较小的内存占用,直到它需要更大,并且当字典变大时,字典的开销可以忽略不计。

答案 2 :(得分:-1)

更新:正如人们在评论中所指出的那样, int [,] 在C#中似乎与C ++ int [] []完全不同,我假设,我让答案作为参考。因此,当您的表演没有受到影响时,您应该始终更喜欢可读性,请使用 int [,] 而不是我在下面提出的建议。

我还要补充说,甚至可以更简单地使用简单的 int [] 来表示二维区域。你可以这样轻松地做到这一点:

int[] myArray = new int[width * height];

int x, y; // suppose you want to reach the cell at (x, y) coordinates
int cell = myArray[x + y * width];

for(int i=0 ; i<myArray.Length ; ++i) // suppose you want to iterate through the array
{
    int x = i % width;
    int y = i / width; // be sure that width is an int here, we want the auto-flooring

    int cell = myArray[x + y * width] // like above ;)

    int cell = myArray[i] // or of course for simplicity
}

在我写这篇文章时,我不太确定[]在C#中比[,]效率更高,但我知道它在C ++中。

关于此事的完整教程:Using Single Dimensional Array to Represent Two Dimensional Data