BufferedImage:具有透明颜色/图像的fillRect / drawImage的性能

时间:2014-08-22 11:45:15

标签: java performance swing

我发现了性能瓶颈,我不知道如何解决它。

简介:我写了一个JComponent的子类,用50到50个网格绘制图像。每个图像的大小为50到50像素。 " paintComponent"的性能当图像是" TRANSLUCENT"。

时变得非常糟糕

所以,我用fillRect而不是drawImage做了一些测试,当颜色有alpha值时我得到了同样的行为。

这里是示例代码:(只是用于演示性能差异的示例代码)

  private final GraphicsConfiguration graphicsConfiguration = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
  .getDefaultConfiguration();

  // ...

  protected void paintComponent(final Graphics graphics) {
  super.paintComponent(graphics);

  final BufferedImage buffer = this.graphicsConfiguration.createCompatibleImage(this.getWidth(), this.getHeight(), Transparency.TRANSLUCENT);
  final Graphics2D bufferGraphics = (Graphics2D) buffer.getGraphics();

  bufferGraphics.setColor(new Color(110, 110, 110));

  for (int dy = 0; dy <= super.getHeight(); dy++) {
    for (short dx = 0; dx <= super.getWidth(); dx++) {        
      bufferGraphics.fillRect(dx, dy, 1, 1);
    }
  }
  graphics.drawImage(buffer, 0, 0, null);
}

当&#34; bufferGraphics.setColor(new Color(110,110,110));&#34;时,性能变差(大约慢30倍)。被替换为&#34; bufferGraphics.setColor(new Color(110,110,110,110));&#34;

问题:是否有人知道如何改善效果?

提前致谢

1 个答案:

答案 0 :(得分:3)

是的,直接在传递给graphics的{​​{1}}上绘制。为什么要创建一个缓冲的图像,在上面绘图然后在paintComponent()上复制/绘制整个图像(然后丢弃缓冲的图像)?

Swing已经是双缓冲的(默认情况下):已经在缓冲区上绘制传递的graphics,这将在graphics的绘制过程结束时显示。因此,您尝试双重缓冲是完全没必要和多余的。

如果由于某些未知原因您确实需要此功能,则应缓存创建的JComponent并在后续BufferedImage调用中重复使用它。 Swing是单线程的,您甚至不必同步它或担心并发访问。