Java& OpenGL的;使用delta计算帧独立移动时渲染工件

时间:2012-11-05 23:45:46

标签: java opengl lwjgl delta

所以,我一直在使用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]返回一个几乎同样大但是NEGATIVE的值?

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

我无法弄清楚什么是错的,或者我的代码中是否有任何错误?

1 个答案:

答案 0 :(得分:1)

您目前正在将sinIncsinInc2乘以delta,那么与帧速率无关的是......转速?

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

首先应将delta乘法移到公共因子,而不是在任何地方粘贴* delta

sinInc += (0.0015 * delta);

将清楚地表明,正弦增加将与帧率无关,单位时间为.0015单位。

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

obj.xPosition += (obj.xVelocity * delta);