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

看板java作者 (恢復的道路)時間16年前 (2009/04/07 20:53), 編輯推噓1(101)
留言2則, 2人參與, 最新討論串1/4 (看更多)
之前在作模擬跑動畫 程式的架構是這樣的 繼承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毫秒) 程式要怎麼去架構 才可以達成需求???? 有請版上強者解答了... ====== 小的我想過兩個方法 覺得邏輯沒有錯 可是跑起來不對@@ 方法一 public void run(){ long time =System.currentTimeMillis(); while(true){ if(System.currentTimeMillis() - time >=20){ //不暫停執行緒 一直試到間隔20毫秒才進入 time = System.currentTimeMillis(); repaint(); calculateNextState(); } } } ======= 方法二 public void run(){ long time =System.currentTimeMillis(); long timeInterval; while(true){ repaint(); calculateNextState(); timeInterval = System.currentTimeMillis() - time; if(timeInterval < 20){ Thread.sleep(20 - timeInterval); } } } 有人知道為什麼這樣子寫 動畫還是無法維持50fps嗎??? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.112.14.100

04/11 16:27, , 1F
第二個方法的time好像沒更新:p
04/11 16:27, 1F

04/11 17:03, , 2F
謝謝樓上 我這邊漏打了
04/11 17:03, 2F
文章代碼(AID): #19sqpTwe (java)
討論串 (同標題文章)
文章代碼(AID): #19sqpTwe (java)