我尝试优化我的应用程序的绘图。目前我已经实现了一个动画以及几个 GUI 组件。有些是完全分开的,有些是相互重叠的。目前我面临 Swing 组件重叠的问题。 GUI 的一部分与我的动画重叠,需要绘制大量字符串和 - 放入 Jlist 中 - 常见的 Swing 组件。
结果,重叠的 GUI 会随着动画的更新而重新绘制。我尝试使用很多不同的方法来确定在彼此面前绘制的内容。像 GlassPane、Jlayeredpane 这样的东西。不幸的是,在这些尝试中,重叠的 Menus PaintComponent 方法只需要在用户与它们交互时被调用,但由于动画而被频繁调用,并导致相当高的 CPU 使用率。
我尝试在分层 Pane 中以较低的顺序放置菜单,即:
getLayeredPane().add(map, JLayeredPane.DEFAULT_LAYER);
getLayeredPane().add(mapController, JLayeredPane.PALETTE_LAYER);
getLayeredPane().add(settings, JLayeredPane.PALETTE_LAYER);
getLayeredPane().add(painter, JLayeredPane.POPUP_LAYER);
在画家的绘画过程中,我尝试修改该区域 - 即:
@Override
protected void paintComponent(Graphics g) {
g2 = (Graphics2D)g;
g2.setRenderingHints(DefaultResources.getRenderQuality());
g2.clip(JMain.getInstance().getMapBounds());
...}
好吧 - 一旦画家组件!isOpague();下面的所有组件都会被重新绘制。不幸的是,如果我确实将菜单放在更高的顺序中,它们也需要随着任何动画更新而重新绘制。
有人知道如何避免与动画组件重叠组件的永久重绘吗?
我见过的唯一解决方案是使用重量级容器。不幸的是,相对定位在移动过程中也表现出了一种不合适的行为。
感谢您的任何建议!!
最佳答案
嗯,很明显,如果您有重叠的非不透明组件,那么所有这些组件都将在其中一个组件发生任何更改时重新绘制,除非您优化对某些特定矩形的动画重绘调用,所以不会有任何无用的操作。
让我详细描述一下 Swing 的工作原理 - 您在 Paint、paintComponent 和其他方法(在每个组件重绘时调用)中所做的所有绘画都是在包含“缓存”版本的单个图像的子图像上完成的整个框架的接口(interface)。
现在假设您更改了 UI 中的某些内容(添加/删除/重绘组件) - 最终图像(或至少包含您的组件的一小部分)必须正确更新。为此,如果您的组件不是不透明的,所有子组件都将使用您的组件边界作为重绘矩形进行重新绘制,以便为您的组件创建正确的背景。如果您的组件是不透明的 - 它将是唯一一个被重新绘制的组件,但它也必须自行填充整个边界矩形,否则您将在每次重新绘制时在组件后面看到可怕的绘制伪影。
总结 - 为了避免无意义地重绘重叠组件,有几种方法:
- 优化对实际需要重绘区域的动画重绘调用
- 使用不透明组件,除非您想在组件中绘制透明的内容
- 优化所有重叠组件的绘制操作,这样重新绘制就不会花费太多时间
根据您的具体情况,可能还有更多的优化方法,但您必须自己找到它们,因为在不了解全局的情况下这是不可能的。
您还可以在本书中找到许多有关 Swing 优化的有用信息:Filthy Rich Clients
关于java - 使用 swing 的动画管道,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12674122/