1

因此,我一直在使用 opengl 在 java 中制作一个小型演示程序,作为练习。一切都很顺利,直到我实现了 getTime(); 和 getDelta(); 计算每帧花费多少时间的函数。然后我通过将它们的速度乘以 getDelta() 将其应用于我所有的运动计算;它运作良好,只有当帧随机轻微下降和 getDelta(); 返回一个稍大的值,我的计算开始输出非常奇怪的值,这些值仍然在计算计算的运动范围内但不正确,这发生在几帧直到帧速率上升到正常(在这种情况下为 250FPS)和运动正常继续,甚至从确切位置继续。自 getDelta(); 以来,我不知道是什么原因造成的。似乎运作正常?

继承人一些代码:

private void movementCalculations(double delta) {

    sinInc += 0.0015;
    sinInc2 += 0.010;

    xMove[0] = xSpeed * (float) Math.sin(Math.toDegrees(sinInc / 100 * delta)) * 7500;
    yMove[0] = ySpeed * (float) Math.sin(Math.toDegrees(sinInc / 200 * Math.PI * delta)) * 2500;
    zMove[0] = zSpeed * (float) Math.sin(Math.toDegrees(sinInc / 200 * delta)) * 1250;

    for (int i = 1; i<16; i++) {
        xMove[i] = xSpeed * (float) Math.sin(sinInc2 / 128 * Math.PI * i/2 * delta) * WIDTH * 16;
        yMove[i] = ySpeed * (float) Math.sin(sinInc2 / 64 * Math.PI * i * delta) * HEIGHT * 4;
    }

    xMove[16] = xSpeed * (float) Math.sin(sinInc2 / 64 * Math.PI * 2 * delta) * WIDTH * 8;
    yMove[16] = ySpeed * (float) Math.sin(sinInc2 / 32 * Math.PI * 2 * delta) * HEIGHT * 4;

    xMove[17] = xSpeed * (float) Math.sin(sinInc2 / 32 * Math.PI * 2 * delta) * HEIGHT * 10;
}

在以下调试输出中,Delta 4.0 是 250FPS 的正常值,然后 FPS 下降,突然 xMove[17] 返回几乎一样大但为负的值?

Last frame in milliseconds: 231884072 Delta: 4.0 xMove[17]: 164.297 Last frame in milliseconds: 231884077 Delta: 5.0 xMove[17]: -160.83817 Last frame in milliseconds: 231884080 Delta: 3.0 xMove[17]: -0.7198944 Last frame in milliseconds: 231884084 Delta: 4.0 xMove[17]: 162.12277

如果这还不够,这里有一个应用程序的工作 JAR 可执行文件,它包含在 JAR 中运行它的所有内容,因此您可以看到自己: http ://harha.us.to/files/files_public/Starfield_Exe.jar

我只是不知道出了什么问题,或者我的代码中有什么问题吗?

4

1 回答 1

1

您当前正在乘以增量,那么与帧速率无关的是...旋转速度sinIncsinInc2

您可能想要乘以移动速度 ( {x|y|z}Speed),但很难确定。

您应该首先将 delta 乘法向上移动到公因数,而不是* delta到处粘贴。

sinInc += (0.0015 * delta);

将清楚地表明正弦增加将与帧速率无关,每单位时间为 0.0015 个单位。

至于运动,我怀疑你在someXCoordinate[i] += xMove[i]某个地方做。如果是这样,那么这就是放置 delta 的地方:

obj.xPosition += (obj.xVelocity * delta);
于 2012-11-06T04:12:11.877 回答