2010-08-31 47 views
4

我正在研究一个Java程序,其中包含许多动画作为UI的一部分。每个动画都需要调用重画方法才能使动画发生。我只是想知道,如果对每个动画使用单独的线程是很好的编程,每个动画都会调用它们各自的重绘方法。在Java程序中为每个动画使用线程可以吗?

+0

因此,您在同一屏幕上有几个独立的动画组件? – Justin 2010-08-31 20:43:30

回答

1

不,因为所有这些线程的开销会使进程效率低下。

1

我假设你正在使用Swing?但我不确定。

我建议您阅读http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html,并在Swing中搜索有关线程的更多信息。通常,应该更新GUI的唯一线程应该是Event Dispatch线程,尽管有一些例外。

我认为使用线程是好的,只是问事件调度线程来更新你的UI,

java.awt.EventQueue.invokeLater(new Runnable() 
    { 

     public void run() 
     { 
      //this codes runs on the event dispatch thread 
     } 
    }); 
+1

注意:'SwingUtilities'有它自己的'invokeLater'命令。我假设它只是转发到'EventQueue'版本,但我不积极......但它允许您使用它,而不必键入EventQueue的包或导入它,即使它没有,因为您可能已经导入了javax.swing。 – Powerlord 2010-08-31 20:27:32

2

号还是有的,这取决于你在做什么。

通常只有SwingEvent线程应该绘制到屏幕上,通常是为了响应repaint()。但是,为每个动画制作一个不同的线程来计算应为每个动画绘制的位图,但不绘制它,然后触发SwingEvent线程以实际绘制它。如果动画全部是同步的,或者所涉及的计算量微不足道,则没有任何意义。

如果你有很多线程会有性能损失。我不知道你的申请会受到怎样的惩罚 - 如果你真的想知道,你必须进行实验。

请记住,多线程编程会更复杂(与一个线程顺序执行工作相比),并且拥有更多线程(超过CPU的核心数量)几乎不会允许在给定的情况下完成更多工作时间。

+0

这是一个很好的答案。听起来好像有一个单独的线程在背景中启动,以在显示之前生成帧。 – 2010-08-31 21:56:37

0

对于摆动这将是最好使用一个(或多个)javax.swing.Timer(s)。让计时器在需要更新的所有组件上重新绘制(动画)。您可以创建一个自定义计时器,让您添加/删除组件。但要小心所有涉及的线程。 (你不想死锁/同步问题。)所有的定时器使用相同的线程来等待并在事件派发线程上运行代码。

0

我知道我已经看到了一些完成这件事情的框架,请查看JGoodies动画库;我认为这就是我看到它的地方。

一般来说,想法是尽量减少线程数量(假设动画更新很快,就像切换到已经加载的图片一样),您可以创建一个动画客户端接口,单个动画线程调用EDT上的更新方法所有的客户需要它:

public interface AnimatedComponent { 
public int getInterval(); // how many milliseconds between frames 
public long getLastUpdateTime(); 
public void updateAnimation(); // invoked within the swing EDT 
} 

只要添加一个动画元件,你应该与中央动画线程其将向AnimatedComponent(S)的列表,在需要时调用updateAnimation注册。

public void updateAllAnimations() { 
long nowTime = System.currentTimeMillis(); 
for (AnimatedComponent c : someList) { 
    if (c.getLastUpdateTime() - nowTime >= c.getInterval()) { 
    c.updateAnimation(); 
    c.repaint(); 
    } 
} 
} 

你应该秋千上EDT从计时器线程定期(每秒2-3次,这取决于你的动画是如何迅速地预计更新)安排此。

相关问题