【问题标题】:Active rendering and the EDT (Swing animation)主动渲染和 EDT(Swing 动画)
【发布时间】:2010-10-15 18:26:40
【问题描述】:

我应该如何在 Swing 小程序中运行动画?

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

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

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

【问题讨论】:

    标签: java swing animation applet edt


    【解决方案1】:

    需要注意的几件事是确保您只重绘需要重绘的内容,而不是每次都重绘整个图形上下文,除非有必要。还有一个timing framework 可以用来处理一些动画。我不认为它正在积极开发中,但上次我查看它时,它有一些不错的 api 可用于动画。

    在不知道您的具体用例的情况下,这就是我能想到的全部内容。

    【讨论】:

    • 谢谢,实际上时序框架和优化(包括裁剪)已经相当成熟,因为 Swing 小程序基本上是从 AWT 转换而来的。在调用执行之前,用 invokeLater 和 sleep(1) 替换活动渲染是一个简单的交换,它插入到旧代码中。
    【解决方案2】:

    您可以在另一个线程中将图形绘制到您自己的屏幕外图像中,然后在 EDT 中复制到屏幕上。但是对于单线程的东西,我希望你的帧速率足够高,能够在 EDT 中完成。

    【讨论】:

    • 感谢 Tom,问题仍然是通过 Swing 计时器的 EDT 缺乏精度,无论计时器上执行了多少工作。以下是请求 60fps 时调用之间的一些毫秒示例(方法仅记录时间)。这是无法接受的。 19 32 29 18 28 19 28 44 7 27
    • 是的,Swing 计时器的分辨率很差(至少在某些平台上)。但是您可以在另一个线程上运行适当的调度程序并稍后调用(这几乎是 Swing Timer 的实现方式)。
    • 我错误地认为稍后的调用会像摇摆计时器一样不可靠。不是,是准确的。现在只需进行一些工作以产生和防止调用稍后备份,它应该在那里。感谢您的建议。
    • invokeLater 没有刻意延迟,但如果 GUI 忙,可能会延迟。 IIRC,对于 Swing Timer(以及 currentTimeMillis)来说,尤其是等待是不可靠的。因此,请小心解决调度程序线程中的问题。
    猜你喜欢
    • 2014-03-09
    • 2011-10-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2020-06-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多