所以,我一直在使用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
我无法弄清楚什么是错的,或者我的代码中是否有任何错误?
答案 0 :(得分:1)
您目前正在将sinInc
和sinInc2
乘以delta,那么与帧速率无关的是......转速?
您可能希望乘以移动速度({x|y|z}Speed
),但很难确定。
首先应将delta乘法移到公共因子,而不是在任何地方粘贴* delta
。
sinInc += (0.0015 * delta);
将清楚地表明,正弦增加将与帧率无关,单位时间为.0015单位。
至于运动,我怀疑你在某处做someXCoordinate[i] += xMove[i]
。如果是这样,那么这就是放置delta的地方:
obj.xPosition += (obj.xVelocity * delta);