【问题标题】:Painting BufferedImage Performance绘制 BufferedImage 性能
【发布时间】: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


【解决方案1】:

这里很难说问题出在哪里,但是如果您担心帧率,那么我建议您阅读 Andrew Davison 的一部作品,特别是第二章和第三章。章节草稿可在此处获得:http://fivedots.coe.psu.ac.th/~ad/jg/

虽然 Swing 是为轻量级而量身定制的,但如果您要使用它制作大量的动画,则还有其他注意事项。您需要将绘图计时到帧速率,定期输出,甚至可能除了 FPS 之外还运行 UPS 计时器。这仍然很有可能,而且您正朝着正确的方向前进。

很抱歉,我无法提供更多帮助。祝你好运。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-21
    • 2011-12-19
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 2014-08-06
    相关资源
    最近更新 更多