2013-04-11 68 views
1

我注意到一些非常奇怪的事件(最終導致我的遊戲崩潰),並且我找不到問題可能是什麼。我已經運行了兩個小時以下的方法,輸出總是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值非常精確,有輕微或沒有波動,但仍保持增長。

+0

我認爲你的delta計算已關閉。基本上'delta = t1 - t0;'是計算它循環通過遊戲循環所花費的時間,從輸出來看,它大約需要一毫秒。你實際需要做的是從這個值中減去MAXIMUM等待時間。例如,如果你想要25fps,那麼你需要類似'delta = 40 - (t1 - t0);'這會給40毫秒或更少的最大增量,以保持平均25fps ...(不要忘記允許負值;)) – MadProgrammer

+0

我意識到這一點,這只是我的測試設置,我確實在你的所有(我的整個其他兩款遊戲:D)中提出了建議。我在這裏遇到的問題是睡眠的好奇行爲,它會泄漏。 – arynaq

+1

1)*「我已經注意到了一些非常奇怪的東西(最終會導致我的遊戲崩潰),並帶着'Thread.sleep()'」*如果這是一個Swing/AWT應用程序。重繪應該可能由'java.swing.Timer'觸發,此後不需要'sleep(n)'。 2)爲了更快地獲得更好的幫助,請發佈[SSCCE](http://sscce.org/)。 –

回答

6

在您的循環中,您的增量計算包含之前睡眠的時間,然後睡眠這個新的增量時間。如果睡眠(或你的代碼)速度很慢(比如說1ms,可能會發生),那麼下次你的增量將會增加1ms,所以你會睡2ms。

你的下一次迭代,因爲你上次睡了2ms,至少會有2ms。如果睡眠或你的代碼再次緩慢(會發生),那麼你下次會睡3毫秒等等。您正在積累由於您的增量而可能發生的所有緩慢行爲,包括之前的睡眠時間和其中的任何錯誤。

+1

+1正好在我之前 - 也是GC可以讓它「慢」的一部分。無論哪種方式,睡眠時間應該從增量中減去,而不是增加。 – ddmps

+0

@Pescis同意GC問題(實際上可能是罪魁禍首)。 –

+0

這讓我感覺很好,謝謝。 – arynaq