作者sbrhsieh (sbr)
看板java
标题Re: [问题] 关於动画模拟 使用Thread 程式的架构
时间Wed Apr 8 02:19:26 2009
※ 引述《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
1F:推 howdou:感谢回覆^^ 04/09 13:46