[問題] 關於動畫模擬 使用Thread 程式的架構
之前在作模擬跑動畫 程式的架構是這樣的
繼承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
04/11 16:27, 1F
→
04/11 17:03, , 2F
04/11 17:03, 2F
討論串 (同標題文章)
以下文章回應了本文:
完整討論串 (本文為第 1 之 4 篇):