【问题标题】:Java & OpenGL; Rendering Artifacts when using delta to calculate frame independent movementJava和OpenGL;使用 delta 计算与帧无关的运动时的渲染伪影
【发布时间】: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]。会不会是这个问题?

标签: java opengl lwjgl delta


【解决方案1】:

您当前正在将 sinInc 和 sinInc2 与 delta 相乘,那么与帧速率无关的是...旋转速度?

您可能希望增加移动速度 ({x|y|z}Speed),尽管这很难确定。

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

sinInc += (0.0015 * delta);

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

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

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

【讨论】:

  • 是的,就是这样!我只需要将 sinInc 和 sinInc2 与 delta 相乘。我之前尝试过这个,但不知何故认为它不会那样工作,因为现在有增量,它会稍微提高速度,而且当时看起来不对。无论如何,我现在优化了代码,它就像一个魅力,谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-26
  • 2015-11-03
  • 1970-01-01
  • 2016-05-24
  • 2012-10-24
  • 1970-01-01
相关资源
最近更新 更多