总之,我处于一种困境,我无法决定/知道存储“简单”但大量int
数据类型的最佳方法。
现在我正在使用扁平数组int[] TheData = new int[size * size];
,因为我只存储1层,但现在我需要至少3层。最初的整个过程是使用:
Dictionary<uint, int[]> TheNewData = new Dictionary<uint, int[]>();
(关键是图层)
但我对词典没有太多经验,所以我相信这会导致通过数组索引访问数据的问题,就像在平面数组TheData[x + y * width] = ...
或简单地说:
int[,] TheNewData = new int[LayerCount, size * size];
上面的一个让我觉得很脏。
我甚至可以将原始平面阵列大小增加三倍,并将偏移量应用于下一层......
无论如何,我还要考虑到可笑的大地图,比如宽度x高度 1,000 x 1,000 (瓷砖) 1,000,000 < / strong>将瓷砖存储为int
的某处(我认为......)。所以数据访问需要相当快,因为我还要处理可能更新整个“活动”层。
如果您可以请“解释”为什么您建议的方法最适合我们,非常感谢,谢谢。
答案 0 :(得分:4)
如果您要存储多个NxN网格,int[,,] foo = new int[LayerCount, size, size];
会出现什么问题?如果您正在进行随机访问,它很容易索引并且速度很快。如果您正在进行顺序访问,那么使用锯齿状阵列可以获得更好的性能,但初始化它们有点不方便。
多维数组(即int[,,]
)的另一个问题是它们需要一个连续的内存块。如果你只有三层1000 x 1000,这不是问题。因为你只说了12兆字节。但是如果你的大小是1,000,000而不是1,000,那么你将分配12个 giga 字节,这可能会给你带来一些麻烦。
顺便说一下,锯齿状数组的格式为int[][][] foo = new int[LayerCount][][];
,然后必须单独初始化其他维度。这并不难,只是凌乱。但它确实需要一个连续的内存块,但是如果你随机访问它会以一些运行时性能为代价。
或者,您可以使用混合:int[,][]
,您可以将其视为二维数组的数组。在这种情况下,每个图层都是单个分配。
无论如何,如果您知道图层的大小并且知道自己拥有多少图层,那么除了数组之外,没有理由使用任何其他内容。
您当然可以创建一个单维数组行int[] messy = new int[LayerCount * size * size]
,并进行自己的索引编制。看起来好像很多不必要的工作。
有关C#中数组性能特征的一些信息,请参阅http://blog.mischel.com/2013/05/08/are-jagged-arrays-faster-than-rectangular-arrays/。我还没有对三维数组进行任何性能比较,但我希望它们是相似的。