使用arg free repaint()比使用args repaint()好吗?

mbzjlibv  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(270)

我想在墙上画些东西 JPanel 阅读和练习表演风俗画课。当它更新广场使用 repaint 我觉得,使用这个结构

private void moveSquare(int x, int y) {
  if ((squareX != x) || (squareY != y)) {
     squareX = x;
     squareY = y;
     repaint();
  }
}

为这个具体的例子提供了比推荐的更好的油漆性能

private void moveSquare(int x, int y) {
  int OFFSET = 1;
  if ((squareX != x) || (squareY != y)) {
     repaint(squareX, squareY, squareW + OFFSET, squareH + OFFSET);
     squareX = x;
     squareY = y;
     repaint(squareX, squareY, squareW + OFFSET, squareH + OFFSET);
  }
}

如果我使用后一个,正方形在拖动过程中看起来有些“挤压”。
我知道,这是一个非常基本的例子,但是它让人们对java图形的性能有点恐惧。

kpbpu008

kpbpu0081#

做两次重绘是不自然的。
什么时候才重新粉刷新老广场的结合?

private void moveSquare(int x, int y) {
  if (squareX != x || squareY != y) {
     final int OFFSET = 1;
     int minx = Math.min(x, squareX);
     int miny = Math.min(y, squareY);
     int dx = Math.abs(x - squareX);
     int dy = Math.abs(y - squareY);

     squareX = x;
     squareY = y;
     repaint(minx, miny, squareW + dx + OFFSET, squareH + dy + OFFSET);
  }
}

当正方形相对较小或超出显示区域(剪裁)时,这应该更平滑。

rggaifut

rggaifut2#

no arg和 paint() 带参数的是,带参数的将在对的后续调用中设置剪裁区域 paint() . 油漆性能的差异(如果有的话)将取决于 paint() 方法实际上考虑了裁剪区域,或者只是绘制整个绘图区域,然后离开平台来计算该区域是否需要更新。
许多javaawt/spring组件忽略了裁剪区域,只绘制整个区域。这样做有时比精确地计算出如何重新绘制显示区域的特定部分要快。如果组件是您自己编写的,并且您知道您没有在其中测试剪裁区域 paint() ,那你就知道你打电话和不打电话没什么区别了 repaint() 有没有争论。
另一方面,如果你在 paint() 实现时,要精确地计算出如何重新绘制子区域,那么您就必须自己尝试计算出如何最好地调用 repaint() .
如果您没有编写组件,那么可能知道是否最好指定重绘区域,除非通过测试或仔细检查源代码(如果您有)。
如果使用 repaint() 带参数会导致绘制一个扭曲的图像,这可能指向一个缺陷 paint() 实施。

相关问题