Re: [問題] 關於動畫模擬 使用Thread 程式的架構

看板java作者 (sbr)時間16年前 (2009/04/08 02:19), 編輯推噓1(100)
留言1則, 1人參與, 最新討論串2/4 (看更多)
※ 引述《howdou (恢復的道路)》之銘言: : 之前在作模擬跑動畫 程式的架構是這樣的 : 繼承JPanel在上面繪圖 實作Runnable介面 : public void run(){ : 計算下一個狀態、buffer繪圖 : 畫布繪圖 : 執行緒暫停20毫秒 : } : 程式大略如下 : public class panel extends JPanel implements Runnable : public void run(){ : while(true){ : calculateNextState(); : repaint(); : try{ : Thread.sleep(20); : } : catch(Exception e){ : } : } : } : 這樣可以就可以跑出簡單的動畫 : 但有個問題 : 上面執行緒暫停20毫秒 假設其他運算皆不費時 : 這個動畫理論上最大可到1000/20 = 50 fps 每秒50張圖 : 但實際在計算狀態時一定得花時間 : 所以一定小於50fps : 如果想要讓動畫維持在50fps : (假設狀態的計算與繪圖所花費時間不超過20毫秒) : 程式要怎麼去架構 才可以達成需求???? 主要問題在於 repaint 是個 asynchronous operation,(大致上來說)它的任務可看成 是 queue 一個 PaintEvent 到 event-dispatching thread。他並不是直接造成元件的 paint routine 被執行來繪製外觀。此外過多的 PaintEvent 累積在 event- dispatching thread 裡可能會被合併,因此並不是每 invoke 一次就一定會令元件 repaint 一次。 你提到的兩個方式都是 polling 方式來算時間間隔,這樣會導致 CPU 有太高的使用 率。如果你確定你可以優化到讓 calculateNextState + 元件painting 的時間小於 20 ms,那麼你可以透過 java.util.Timer 以固定 20 ms 來 schedule 一個 [calculateNextState 加上元件 paintImmediately invocation] 到 event-dispatching thread 來執行,這樣子應該不難做到接近 50 frame/sec( 以長時間來看)。 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 218.173.141.185

04/09 13:46, , 1F
感謝回覆^^
04/09 13:46, 1F
文章代碼(AID): #19svan5s (java)
討論串 (同標題文章)
文章代碼(AID): #19svan5s (java)