2010-04-14 79 views
4

我正在用Java編寫一個模擬,其中對象在牛頓物理學下運行。一個物體可能會施加一個力,所產生的速度會導致它在屏幕上移動。模擬的本質意味着對象根據動畫循環的當前迭代和先前迭代之間的時間間隔以不連續的步驟移動;例如測量在應用程序/線程中花費的時間

public void animationLoop() { 
    long prev = System.currentTimeMillis(); 
    long now; 

    while(true) { 
    long now = System.currentTimeMillis(); 
    long deltaMillis = now - prev; 
    prev = now; 

    if (deltaMillis > 0) { // Some time has passed 
     for (Mass m : masses) { 
     m.updatePosition(deltaMillis); 
     } 

     // Do all repaints. 
    } 
    } 
} 

如果動畫線程以某種方式延遲引起大量的時間來之前可能重合(經典情況下Windows下是由此點擊並按住上最小化/最大化防止重繪),這會導致產生的問題物體以驚人的速度移動。我的問題:有沒有辦法確定在動畫線程中花費的時間而不是掛鐘時間,還是有人可以提出解決方法來避免這種問題?

我到目前爲止唯一想到的是通過一些上界來控制deltaMillis

+3

旋蓋三角洲似乎是一個很好的解決方案給我。 – 2010-04-14 12:05:01

回答

6

你有沒有考慮過使用類似計時器的東西而不是在循環中旋轉?

TimerTask tt = new TimerTask(){ 
    long prev = System.currentTimeMillis(); 
    public void run(){ 
    long now = System.currentTimeMillis(); 
    for (Mass m : masses) { 
     m.updatePosition(now-prev); 
    } 
    prev = now; 
    } 
} 

new Timer(true).schedule(tt, 1000, 1000) ; 

你保證至少有你的對象的更新之間存在一些延遲,所以你不應該有一堆重繪作爲連續用,而(真)循環,如果線程被延遲,這樣您將不會立即重新執行該任務,從文檔中獲得:「在固定延遲執行中,每個執行都按照前一次執行的實際執行時間進行計劃。」

3

我發現javax.swing.Timer.html對此特別有幫助。這裏有一個example模擬球形顆粒和容器壁之間的彈性碰撞。

附錄:此相關的approach可能有助於從視圖中分離模型。一個單獨的線程模擬系統的演變,而視圖以固定的速率渲染模型的「快照」。

在任何一種情況下,我都會限制速率以適應最慢的目標平臺。

+0

謝謝 - 我已經在使用Timer,但想離開它,因爲我擔心給定的機器無法跟上指定的幀速率;即我希望機器確定幀頻而不是強制它。 – Adamski 2010-04-14 16:27:08

+0

我明白了,儘管我傾向於根據最慢目標平臺的「渲染預算」來思考過於狹隘。我添加了一個可能提供一些見解的相關示例。 @Jim Blackler的建議可能是最好的。 – trashgod 2010-04-14 18:19:28

+0

U shld參見Adamski的熱點圖形。Theyd blow your mind – 2010-07-15 23:59:32

1

您可能會喜歡本文的標題爲「Java:使用ThreadMXBean獲得線程時間」的article

基本上,有一類ThreadMXBean,使您可以花費在特定Thread花費的時間。我還沒有嘗試過,但方法(和我提到的文章中的例子)看起來很有前途,所以我認爲你可以用這個完成你想要的。

+0

謝謝 - 我會檢查出來。 – Adamski 2010-04-15 11:39:51

相關問題