我正在研究一个Java程序,其中包含许多动画作为UI的一部分。每个动画都需要调用重画方法才能使动画发生。我只是想知道,如果对每个动画使用单独的线程是很好的编程,每个动画都会调用它们各自的重绘方法。在Java程序中为每个动画使用线程可以吗?
回答
不,因为所有这些线程的开销会使进程效率低下。
我假设你正在使用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
}
});
注意:'SwingUtilities'有它自己的'invokeLater'命令。我假设它只是转发到'EventQueue'版本,但我不积极......但它允许您使用它,而不必键入EventQueue的包或导入它,即使它没有,因为您可能已经导入了javax.swing。 – Powerlord 2010-08-31 20:27:32
号还是有的,这取决于你在做什么。
通常只有SwingEvent线程应该绘制到屏幕上,通常是为了响应repaint()。但是,为每个动画制作一个不同的线程来计算应为每个动画绘制的位图,但不绘制它,然后触发SwingEvent线程以实际绘制它。如果动画全部是同步的,或者所涉及的计算量微不足道,则没有任何意义。
如果你有很多线程会有性能损失。我不知道你的申请会受到怎样的惩罚 - 如果你真的想知道,你必须进行实验。
请记住,多线程编程会更复杂(与一个线程顺序执行工作相比),并且拥有更多线程(超过CPU的核心数量)几乎不会允许在给定的情况下完成更多工作时间。
这是一个很好的答案。听起来好像有一个单独的线程在背景中启动,以在显示之前生成帧。 – 2010-08-31 21:56:37
对于摆动这将是最好使用一个(或多个)javax.swing.Timer
(s)。让计时器在需要更新的所有组件上重新绘制(动画)。您可以创建一个自定义计时器,让您添加/删除组件。但要小心所有涉及的线程。 (你不想死锁/同步问题。)所有的定时器使用相同的线程来等待并在事件派发线程上运行代码。
我知道我已经看到了一些完成这件事情的框架,请查看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次,这取决于你的动画是如何迅速地预计更新)安排此。
- 1. 两个线程可以使用相同的线程程序吗?
- 2. 我可以使用pthreads分配每个线程的索引吗?
- 3. Java web小程序可以和离线小程序一样吗?
- 4. JQuery动画:在动画过程中可以改变速度吗?
- 5. 你可以在Dart应用程序中使用Java库吗?
- 6. 可以在应用程序启动时阻止一个线程吗?
- 7. 我可以在单线程中使用两个套接字吗?
- 8. springframework.net可以在Windows移动应用程序中使用吗?
- 9. Java - java线程可以多次启动吗?
- 10. 我可以创建仅由JNI中的每个线程使用的对象吗?
- 11. 每个线程有多个NSManagedObjectContext实例可以吗?
- 12. 你可以在Silverlight中使用多个应用程序域吗?
- 13. 我可以使用REST API远程启动应用程序吗?
- 14. Linux /内核模块:两个用户程序可以使用驱动程序吗?
- 15. 你可以配置一个JBoss Web应用程序为单线程吗?
- 16. 线程池可以重用一个标准线程吗?
- 17. Java的CountDownLatch可以从被动类而不是线程中使用吗?
- 18. 我可以在JAVA中启动一个线程
- 19. 我可以在VB中使用“Stop”作为子程序名吗?
- 20. 这个Java应用程序可以在Heroku上运行吗?
- 21. 在java中为每个用户请求启动一个新线程
- 22. 在多线程Java程序中,每个线程都有自己的System.out副本吗?
- 23. 我可以为我的java程序做一个配置吗?
- 24. 使线程在Java中以特定顺序启动
- 25. 动画使用Java/Swing的跳动,虽然使用的paintComponent和动画线程
- 26. 我可以在Windows XP中作为服务启动程序吗?
- 27. 我可以在使用Cordova的iOS应用程序中使用Java库吗?
- 28. 使用C#,你可以在WPF中拖动一个画布吗?
- 29. 在Java中每个方法启动一个线程
- 30. 您可以暂停Java应用程序并从应用程序中获取它的线程快照吗?
因此,您在同一屏幕上有几个独立的动画组件? – Justin 2010-08-31 20:43:30