我正在为一个使用Swing UI工具包的旧应用程序开发一个插件。据我所知,Swing的理念是一切都在事件调度线程上执行。我需要集成一个JPanel,它每16ms重新绘制一次((。
我认为这将导致EDT充斥着重新绘制JPanel,并使其他事件等待更长时间,(在Javadocs中提到(这可能会减慢应用程序的速度。我已经在应用程序的一个测试实例中看到了速度减慢的情况。
在我看来,现在有两种解决方案:
-
将所有内容渲染到图像中,然后将其渲染到屏幕上,这样,长时间的计算可以通过背景线程渲染,EDT可以绘制一个简单的图像,从而减少延迟。
-
只有当用户实际正在执行某项操作时,才进行重新绘制调用。
在Swing UI中绘制动态、频繁更新的内容而不阻塞EDT和UI的其他部分的性能方法是什么
在Graphics/Graphics2D上绘制复杂建模对象的动画、处理更改确实可以分离。无论是SwingWorker、SwingTimer还是事件驱动。
可以将BuffferedImage
与getGraphics
一起使用,并在Graphics2D
图形的末尾执行disposeGraphics
。将兼容的图像类型作为屏幕的Graphics
。
然后实际绘制将只在paintComponent
更新事件处理中执行drawImage
。
记录处理时间,并重新绘制-以进行优化。这种分析对于了解性能瓶颈至关重要。
昂贵的东西往往可以改进。比如使用仿射变换,当然还有预加载的图像等等。比如用轻量级绘图代替微小的JComponent层次结构。就像修剪看不见的部分。