Java 活动渲染和EDT(Swing动画)

Java 活动渲染和EDT(Swing动画),java,swing,animation,applet,edt,Java,Swing,Animation,Applet,Edt,如何在Swing小程序中运行动画 我有一个动画线程执行活动渲染,它最初的动画效果很好。有时(1分钟到2小时后),它开始无法更新屏幕,只出现声音。我认为这是因为绘制不是从EDT执行的,这会导致某种并发问题 那么,是否应该仅从EDT调用活动渲染(即getGraphics()和绘画)?这方面的一个问题是摆动计时器缺乏精度 或者有没有人在不使用EDT的情况下成功地进行了主动渲染,并且完全禁用了对页面的任何EDT更新(可能使用画布/或忽略JPanel上的重新绘制)?您可以在另一个线程中将图形绘制到自己的屏

如何在Swing小程序中运行动画

我有一个动画线程执行活动渲染,它最初的动画效果很好。有时(1分钟到2小时后),它开始无法更新屏幕,只出现声音。我认为这是因为绘制不是从EDT执行的,这会导致某种并发问题

那么,是否应该仅从EDT调用活动渲染(即getGraphics()和绘画)?这方面的一个问题是摆动计时器缺乏精度


或者有没有人在不使用EDT的情况下成功地进行了主动渲染,并且完全禁用了对页面的任何EDT更新(可能使用画布/或忽略JPanel上的重新绘制)?

您可以在另一个线程中将图形绘制到自己的屏幕外图像中,并在EDT中复制到屏幕上。但是对于单线程的内容,我希望您的帧速率足够高,能够在EDT中完成。要注意的几点是确保您只重新绘制需要重新绘制的内容,而不是每次都重新绘制整个图形上下文,除非有必要。此外,还有一个可用于处理某些动画的。我不认为它正在积极开发中,但上次我看它时,它有一些很好的api用于动画


在不知道您的具体使用情况的情况下,我只能想到这一点。

谢谢Tom,问题仍然是通过摆动计时器的EDT缺乏精度,无论计时器上执行了多少工作。以下是请求60fps时调用之间(方法仅记录时间)的一些以毫秒为单位的示例。这是不能接受的。19 32 29 18 28 19 28 44 7是的,摆动计时器分辨率很差(至少在某些平台上)。但是您可以在另一个线程上运行适当的调度程序,然后调用(这几乎就是Swing Timer的实现方式)。不是,是准确的。现在,只要做一些让步和防止invoke Later备份的工作,它就应该存在了。谢谢你的建议。在invokeLater中没有故意的延迟,尽管如果GUI忙的话可能会迟到。IIRC,对于Swing定时器(以及currentTimeMillis),等待尤其不可靠。因此,请小心地绕过调度程序线程中的问题。谢谢,实际上,计时框架和优化(包括剪辑)已经相当成熟,因为Swing小程序基本上是从AWT转换而来的。使用invokeLater和sleep(1)替换活动呈现,直到调用完成,这是一个简单的交换,可以在旧代码中插入插槽。