【问题标题】:How to repaint only dirty region in Swing?如何在 Swing 中仅重绘脏区域?
【发布时间】:2017-09-20 20:23:53
【问题描述】:
  1. 重绘脏区是否只会提高性能?

  2. 如果答案是肯定的,怎么办? 本来我用 repaint() 来调用paintComponent(Graphics);但是,最近我知道 repaint() 实际上是 repaint(0,0,width,height),它每次都会重新绘制所有内容。如果我使用带参数的 repaint() 来指定脏区,它将以什么方式将这些数据传递给paintComponent(Graphics)?

【问题讨论】:

  • “重绘脏区是否只会提高性能?”除非您的代码经过优化以使用它。除非您检查当前的clip 边界并且只更新其中出现的内容,否则它几乎没有提供性能改进 - 因为在一天结束时,Java 仍然需要将整个生成的位图绘制到屏幕上- 也许看看Painting in AWT and Swing,其中有关于该主题的讨论

标签: java swing


【解决方案1】:

如果我使用带参数的 repaint() 来指定脏区,它将以什么方式将这些数据传递给 paintComponent(Graphics)?

“剪辑边界”或图形对象将被设置到指定区域

1.重绘脏区是否只会提高性能?

为什么?你有绘画问题。不要对代码进行微优化,除非你有理由这样做。代码将更难维护和调试。您将添加额外的逻辑来确定需要重新绘制哪些区域。

另外,请记住,多个重绘请求会合并为一个请求。因此,如果您请求重绘一个组件的左上角,并立即请求重绘右下角,这两个请求将合并到一个包含两个区域的区域中,这意味着整个组件将被重绘.所以你白白做了额外的工作。

【讨论】:

  • 我有一个绘制方法,它会多次调用 Graphics.fill()。当鼠标靠近它们时,一些形状会发生变化,所以我天真地重新绘制了所有东西。它在 4K 尺寸下大大落后。我通过重绘(边界)获得了更好的性能。无需减少对 fill() 的调用次数。 ?
【解决方案2】:

要仅重绘大JComponent 的“脏”区域,您需要使用RepaintManager。您可以通过以下方式获取当前的RepaintManager

RepaintManager rm = RepaintManager.currentManager(component);

您甚至可以将RepaintManager 替换为您自己的自定义版本。更多详细信息可以在Oracle 的网站上找到。

【讨论】:

  • 您不直接使用 RepaintManager 来绘制脏区域。每次对组件发出 repaint(...) 请求时,Swing 都会自动将重绘请求转发到 RepaintManager,指定的区域被添加为脏区域。然后,RepaintManager 将为您合并这些脏区域,然后在组件上调用 paint()。
猜你喜欢
  • 1970-01-01
  • 2013-01-29
  • 1970-01-01
  • 2013-03-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多