2012-11-05 32 views
1

所以,我一直在使用opengl在java中製作一個小型演示程序,就像練習一樣。直到我實現了getTime(),一切進展順利;和getDelta();函數來計算每個幀需要多少時間。然後我通過將它們的速度乘以getDelta()來將它應用到我所有的運動計算中。並且它工作的很好,只是當幀隨機略有下降和getDelta();返回一個稍大的值,我的計算開始輸出真正奇怪的值,這些值仍然在計算計算的運動範圍內,但是不正確,這會發生幾幀,直到幀率上升到正常水平(在這種情況下爲250FPS)通常甚至從確切的位置繼續。自從getDelta();我不知道什麼可能會導致這種情況。似乎功能正常?Java&OpenGL;當使用delta來計算幀獨立運動時渲染僞影

繼承人一些代碼:

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; 
} 

在下面的調試輸出,達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 exectuable所以你可以看到自己: http://harha.us.to/files/files_public/Starfield_Exe.jar

我只是想不通出了什麼問題,或者甚至在我的代碼中有什麼錯誤?

+0

正弦輸出範圍爲[-1,1]。這可能是問題嗎? – Torious

回答

1

您目前將sinIncsinInc2乘以delta,所以幀速率無關的是......旋轉速度?

雖然很難確定,但您可能需要乘以運動速度({x|y|z}Speed)。

您應該首先將delta乘法移動到公因子,而不是粘貼* delta

sinInc += (0.0015 * delta); 

將明確表示正弦增加將與幀率無關,每單位時間0.0015個單位。

至於運動,我懷疑你在做someXCoordinate[i] += xMove[i]的地方。如果是這樣,那麼這就是放置增量的地方:

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

是的,就是這樣!我只需要將sinInc&sinInc2與delta相乘即可。我之前嘗試過,不知怎的,它認爲它不會像那樣工作,因爲它現在略微提高了速度,現在有三角洲,它看起來錯了。無論如何,我現在優化了代碼升技,它的作品就像一個魅力,謝謝! – Harha