我有以下代码。它用于计算在OpenGL中使用的纹理位置,但是,这是无关紧要的。它第一次完美运行,但只是第一次。
public static float[] createTexturePositions(final int width, final int height)
{
float[] positions = new float[width * height * 12];
// Range: 0 - 1
float dx = 1f / width;
float dy = 1f / height;
float y = 0f;
int i = 0;
for (int indexY = 0; indexY < height; indexY++)
{
float x = 0f;
for (int indexX = 0; indexX < width; indexX++)
{
float top = y;
float left = x;
float right = x + dx;
float bottom = y + dy;
// p1 p2
// p3
positions[i ] = left;
positions[i + 1] = top;
positions[i + 2] = right;
positions[i + 3] = top;
positions[i + 4] = left;
positions[i + 5] = bottom;
// p4
// p5 p6
positions[i + 6] = right;
positions[i + 7] = top;
positions[i + 8] = left;
positions[i + 9] = bottom;
positions[i + 10] = right;
positions[i + 11] = bottom;
x += dx;
i += 12;
}
y += dy;
}
return positions;
}
现在,发生的事情毫无意义。 - 即使输入完全相同,此函数也会返回不同的值。 - 随机出错 - 错误不会在第一次发生时发生,但通常在第4次呼叫时,数据与之前的呼叫不匹配。 - 值相差很多,我得到:0.85714287 vs 1.1417698E35,索引i = 565.我的输入值是7,7。 - 在上述情况下,第二个值是无意义的值(e ^ 35)。但这是从头开始生成的价值。 I.E.它应该没有被修改的方式。 - 我只返回数组的副本,从而确保被测试的是我认为的那个! - 舍入误差不重要,因为它们每次都应该是相同的,即使它们不同,它们至少应该在值上相似。
在我看来,这似乎是一个数据损坏问题。像某人或某事正在修改我的数据!是否存在某种堆栈堆冲突问题或者我不知道的奇怪的事情?
更新1:
我发现添加以下代码:
testValue( top );
testValue( left );
testValue( right );
testValue( bottom );
private static void testValue(float value)
{
if (value < 0f || value > 1.01f) throw new RuntimeException("Error! Value is Invalid");
}
可以防止问题发生! testValue函数当然放在原始函数之后,在确定值之后直接调用testValue。
更新2:
我可以通过注释/取消注释testValue代码来打开/关闭问题。再一次,这没有任何意义,我想我会把这些代码放在那里,因为它正在解决我的问题!