【发布时间】:2012-11-05 23:45:45
【问题描述】:
所以,我一直在使用 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
我就是不知道出了什么问题,或者我的代码中是否有任何问题?
【问题讨论】:
-
正弦的输出范围为 [-1, 1]。会不会是这个问题?