【发布时间】:2015-07-22 06:36:03
【问题描述】:
我有一个 Java 应用程序,它有几个 JPanel,每个 JPanel 执行大量绘画,我遇到了很多性能问题。我正在使用下面的技术来尝试不那么痛苦,即仅在面板上的某些内容发生更改时才将 JPanels 内容绘制到 BufferedImage,而不是在主窗口调用重绘时进行。当每个面板中的一些内容发生变化时,应用程序会变慢并且动画变得非常紧张。
我检查了 CPU,它只有 5% 左右,但当有一些更新正在进行时,更新显得非常紧张。有什么可能会影响这一点吗,我只会在 CPU 压力大时出现抖动问题。
public class myClass extends JPanel {
private BufferedImage bImage;
private void updateImage() {
BufferedImage temp= new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics g = temp.getGraphics();
Graphics2D g2 = (Graphics2D) g;
//Do lots and lots of drawing on g with other bufferedImages and lines and text etc
synchronized (bImage) {
bImage = temp;
}
}
public void paintComponent(Graphics g) {
synchronized (bImage) {
g.drawImage(bImage, 0, 0, this);
}
}
【问题讨论】:
-
你在使用双缓冲吗? - 它可以帮助
-
这在我看来并不合理,因为您没有调用超级的paintComponent 方法并且您的同步。如果您创建并发布了minimal example program,那就更好了。
-
你多久画一次
JPanel?你是在固定间隔内画画吗? -
Swing 已经使用双缓冲,所以我不知道你的方法给你带来了什么好处。什么调用 updateImage() 函数?
-
@Toumash Swing 自动使用双缓冲。
标签: java multithreading performance swing paintcomponent