我真的不知道这叫什么。
我有一个地图生成器对象,以及生成顶点的东西。我想我可以提高性能,如果我使用的地图大小为4的数组,因为每个瓷砖有4个边。
基本上,我想要的是:
array[0] = value.w
array[1] = value.x
array[2] = value.y
array[3] = value.z
array[4] = empty
array[5] = empty
array[6] = empty
array[7] = empty
假设我有一张32x32的地图。 32x32 = 1024. 1024块大小为32x32。我现在有这个:
int[] myValArray = new int[4096];
for (int i = 0; i < 32; i++)
{
for (int j = 0; j < 32; j++)
{
myValArray[i * j] = 0;
myValArray[i * j + 1] = 1;
myValArray[i * j + 2] = 2;
myValArray[i * j + 3] = 3;
}
}
然而,这不会奏效。我究竟做错了什么?在阵列中获得偏移的最佳方法是什么?
我尝试了不同的方法,但没有一种方法可行。如: [i * j * 1] [i * j * 4] [i * j + 4]
答案 0 :(得分:0)
您需要在循环之外初始化myValArray,否则每次都会重置。
如果要为每四个元素分配值,则只需要一个for循环。每次只增加4:
int[] myValArray = new int[4096];
for (int i = 0; i < 4092; i = i + 4)
{
myValArray[i] = 0;
myValArray[i + 1] = 1;
myValArray[i + 2] = 2;
myValArray[i + 3] = 3;
}
答案 1 :(得分:0)
你的索引都搞砸了。我假设您要考虑&#34;行&#34;一组32组4个坐标(128个条目)的连续组。
您当前的代码未正确初始化每一行。看看这个内循环:
for (int j = 0; j < 32; j++)
{
myValArray[i * j] = 0;
myValArray[i * j + 1] = 1;
myValArray[i * j + 2] = 2;
myValArray[i * j + 3] = 3;
}
当i = 0时,您生成的[0 * j + 1]
始终为1
。您经常在索引0, 1, 2, 3
上分配超过32次。
同样,对于i = 1
,您在第一次迭代时生成索引(0, 1, 2, 3)
,然后(1, 2, 3, 4)
然后(2, 3, 4, 5)
...
更改此选项以实际利用32x32阵列的设置。
for (int j = 0; j < 32; j++)
{
int rowOffset = (i * 32 * 4);
int columnOffset = (j * 4);
myValArray[rowOffset + columnOffset + 0] = 0;
myValArray[rowOffset + columnOffset + 1] = 1;
myValArray[rowOffset + columnOffset + 2] = 2;
myValArray[rowOffset + columnOffset + 3] = 3;
}
这是一个.NET fiddle,展示了您的索引是如何出错的。
如果您决定将4个值组合到一个对象中,则不需要*4
。
答案 2 :(得分:-1)
删除int [] myValArray = new int [4096];到循环的外面 除了最后一次更改之外,您将丢失所做的任何更改,因为它每次都会重新创建。