2012-07-20 45 views
0

我已經編寫了一個基於用戶輸入的動畫精靈程序,所有這些都發生在while(true)循環中。到目前爲止,我一直在計算循環的唯一方法是在循環的每次運行結束時都有一個sleep(20)。我已經注意到這個效應對我的精靈的物理造成負面影響,因爲我的計算重力的公式是velocity = velocity + GRAVITY * Elapsed-Time,並且因爲循環沒有以一致的速度運行,所以重力效應也不一致。 有沒有辦法讓循環運行一致或更好的計時方式,以便它實際上按計劃運行?如何使渲染循環以一致的速率運行?

回答

2

首先,確定你想要你的幀持續多久。如果你想每秒30幀,那麼你就必須

final long frameDuration = 1000/30; 

接下來,當你開始渲染,存儲時間,像這樣

final long then = System.currentTimeMillis(); 
render(); // surely it's more than this but you get the idea 
final long now = System.currentTimeMillis(); 

final long actualDuration = now - then; 
final long sleepDuration = frameDuration - actualDuration; 

if(sleepDuration > 0) { 
    sleep(sleepDuration); 
} else { 
    throw new FrameTooLongException(); 
} 
0
velocity = velocity + GRAVITY * Elapsed-Time 

無論你的幀頻這應該工作恆定或不恆定。訣竅是準確地測量經過時間&。測量從循環中的某個點到下一個循環中相同點的經過時間。

+0

是的。我不明白爲什麼。我總是在相同的時間點獲得流逝的時間,但我的精靈跳轉的高度似乎仍然不一致。 – 2012-07-20 17:20:24

+0

您還必須使用'position = position + velocity * Elapsed-Time'相同的經過時間。當然,舍入誤差和時間離散化誤差可能會蔓延(但如果使用雙精度和毫秒,我會期望它們很小)。 – 2012-07-20 18:13:02