gpt4 book ai didi

java - 使用 Swing 的动画管道

转载 作者:行者123 更新时间:2023-12-04 05:30:35 25 4
gpt4 key购买 nike

我尝试优化我的应用程序的绘图。目前我已经实现了一个动画以及几个 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/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com