本文介紹了Thread.sleep()中的奇怪行為的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!
問題描述
我注意到Thread.sleep()
有一些非常奇怪的東西(這最終會使我的游戲崩潰),我不知道問題可能是什么。我已連續運行以下方法兩個小時,輸出始終為100+-5;
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)
測試所證明的)我期望增量非常精確,幾乎沒有波動,但它仍在不斷增長。
推薦答案
在您的循環中,增量計算包含以前休眠的時間,然后在這個新的增量時間內休眠。如果睡眠(或您的代碼)曾經很慢(比如1ms,這是可能發生的),那么下次您的增量將增加1ms,因此您將睡眠2ms。
您的下一次迭代將至少是2ms,因為您上次只睡了2ms。如果睡眠或您的代碼再次變慢(這將發生),那么您將在下一次睡眠3ms,以此類推。您正在累積由于您的增量而可能發生的所有緩慢,包括以前的睡眠時間和其中的任何錯誤。
這篇關于Thread.sleep()中的奇怪行為的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,