我正在开发一个Java程序,它包含很多动画作为UI的一部分。每个动画都需要调用重绘方法才能使动画发生。我只是想知道为每个动画使用一个单独的线程是否很好编程,每个动画都会调用它们各自的重绘方法。
答案 0 :(得分:2)
没有。或者是的,取决于你在做什么。
通常只有SwingEvent线程应该绘制到屏幕上,通常是为了响应repaint()。但是,为每个动画设置一个不同的线程以计算应为每个动画绘制的位图,但不绘制它,然后触发SwingEvent线程实际绘制它可能没问题。如果动画彼此同步,或者所涉及的计算量微不足道,则没有意义。
如果你有很多线程,那么性能会受到影响。我不知道你的申请会受到什么惩罚 - 如果你真的想知道,你将不得不进行试验。
请记住,多个线程编程会更复杂(与一个线程按顺序完成工作相比)并且拥有更多线程(超过CPU拥有的内核数量)几乎从不允许在给定时间内完成更多工作。
答案 1 :(得分:1)
不,因为所有这些线程的开销会使该过程效率低下。
答案 2 :(得分:1)
我假设你正在使用Swing?我不确定。
我建议阅读http://java.sun.com/products/jfc/tsc/articles/threads/threads1.html,并在Swing中搜索有关线程的更多信息。通常,应该更新GUI的唯一线程应该是Event Dispatch线程,尽管有一些例外。
我认为使用线程很好,只需要求Event Dispatch线程更新你的UI,
即
java.awt.EventQueue.invokeLater(new Runnable()
{
public void run()
{
//this codes runs on the event dispatch thread
}
});
答案 3 :(得分:0)
对于摆动,最好使用一个(或多个)javax.swing.Timer
(s)。让计时器调用需要更新(动画)的所有组件上的重绘。您可以制作一个自定义计时器,让您添加/删除组件。但要小心所有涉及的线程。 (您不希望出现死锁/同步问题。)所有计时器都使用相同的线程进行等待,并在事件派发线程上运行代码。
答案 4 :(得分: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次,具体取决于您的动画预计更新的速度)。