我注意到一些非常奇怪的事件(最終導致我的遊戲崩潰),並且我找不到問題可能是什麼。我已經運行了兩個小時以下的方法,輸出總是100 + -5;Thread.sleep()中的奇怪行爲
public void gameLoop() {
t0 = time();
while (GameState.getInstance().getState() == GameCondition.RUNNING) {
engine.update();
sfx.play();
t1 = time();
delta = t1 - t0;
gfx.render((int) delta);
t0 = time();
System.out.println(delta);
sleep(100);
}
}
現在,如果我跑完全相同的方法,但不是沉睡中的常量100我睡delta
public void gameLoop() {
t0 = time();
while (GameState.getInstance().getState() == GameCondition.RUNNING) {
engine.update();
sfx.play();
t1 = time();
delta = t1 - t0;
gfx.render((int) delta);
t0 = time();
System.out.println(delta);
sleep(delta);
}
}
而現在的輸出上寫着:
0
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
1
2
....
After a minute
571
我不我知道我是否太累了,並且犯了一個明顯的錯誤,或者發生了一些非常奇怪的事情,這裏就是睡眠。
private void sleep(long milliSeconds) {
System.out.println();
try {
Thread.sleep(milliSeconds);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
編輯:問題?由於內部方法(在睡眠之前)幾乎沒有時間使用(如sleep(100)
測試所證實的),因此我認爲delta值非常精確,有輕微或沒有波動,但仍保持增長。
我認爲你的delta計算已關閉。基本上'delta = t1 - t0;'是計算它循環通過遊戲循環所花費的時間,從輸出來看,它大約需要一毫秒。你實際需要做的是從這個值中減去MAXIMUM等待時間。例如,如果你想要25fps,那麼你需要類似'delta = 40 - (t1 - t0);'這會給40毫秒或更少的最大增量,以保持平均25fps ...(不要忘記允許負值;)) – MadProgrammer
我意識到這一點,這只是我的測試設置,我確實在你的所有(我的整個其他兩款遊戲:D)中提出了建議。我在這裏遇到的問題是睡眠的好奇行爲,它會泄漏。 – arynaq
1)*「我已經注意到了一些非常奇怪的東西(最終會導致我的遊戲崩潰),並帶着'Thread.sleep()'」*如果這是一個Swing/AWT應用程序。重繪應該可能由'java.swing.Timer'觸發,此後不需要'sleep(n)'。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –