Re: [問題] 關於動畫模擬 使用Thread 程式的架構
※ 引述《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
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 2 之 4 篇):