作者howdou (恢复的道路)
看板java
标题[问题] 关於动画模拟 使用Thread 程式的架构
时间Tue Apr 7 20:53:45 2009
之前在作模拟跑动画 程式的架构是这样的
继承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
1F:推 weiyucsie:第二个方法的time好像没更新:p 04/11 16:27
2F:→ howdou:谢谢楼上 我这边漏打了 04/11 17:03