我发现了性能瓶颈,我不知道如何解决它。
简介:我写了一个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;
问题:是否有人知道如何改善效果?
提前致谢
答案 0 :(得分:3)
是的,直接在传递给graphics
的{{1}}上绘制。为什么要创建一个缓冲的图像,在上面绘图然后在paintComponent()
上复制/绘制整个图像(然后丢弃缓冲的图像)?
Swing已经是双缓冲的(默认情况下):已经在缓冲区上绘制传递的graphics
,这将在graphics
的绘制过程结束时显示。因此,您尝试双重缓冲是完全没必要和多余的。
如果由于某些未知原因您确实需要此功能,则应缓存创建的JComponent
并在后续BufferedImage
调用中重复使用它。 Swing是单线程的,您甚至不必同步它或担心并发访问。