Java2D drawString很慢吗?

时间:2019-09-30 09:37:17

标签: java swing graphics awt java-2d

我正在尝试使用Java Swing / AWT 2D图形在窗口中显示一些非常基本的信息。在这一点上,我只是在绘制一些字符串,但是尽管此任务看起来并不那么困难,但运行速度令人难以置信。

在什么都不画的情况下,我可以以大约100 FPS的速度重新绘制。 1串,大约30 FPS。有20个字符串,大约3 FPS。

最小示例:

import javax.swing.*;
import java.awt.*;

public class Example {
    public static void main(String[] args) {
        JFrame frame = buildFrame();
        JPanel pane = new JPanel() {
            int counter = 0;

            @Override
            public void paintComponent(Graphics g) {
                super.paintComponent(g);
                Graphics2D g2 = (Graphics2D)g;
                g2.setColor(Color.black);
                g2.drawString(Integer.toString(counter++), 20, 20);
                g2.drawString("HALLO", 50, 50);
                g2.drawString("HALLO", 50, 60);
                g2.drawString("HALLO", 50, 70);
                g2.drawString("HALLO", 50, 80);
                g2.drawString("HALLO", 50, 90);
                g2.drawString("HALLO", 50, 100);
                g2.drawString("HALLO", 50, 110);
                g2.drawString("HALLO", 50, 120);
                g2.drawString("HALLO", 50, 130);
                g2.drawString("HALLO", 50, 140);
                g2.drawString("HALLO", 50, 150);
                g2.drawString("HALLO", 50, 160);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 160);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 170);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 180);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 190);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 100);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 110);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 120);
                g2.drawString("DIES IST NUR EINT EST FÜR EINEN LANGENSTRING", 200, 130);
                g2.dispose();
            }
        };
        frame.add(pane);

        while (true) {
            pane.repaint();
            frame.setVisible(true);
        }
    }

    private static JFrame buildFrame() {
        JFrame frame = new JFrame();
        frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        frame.setSize(480, 272);
        frame.setVisible(true);
        return frame;
    }
}

我在树莓派3b +上运行,这不是一台真正快速的机器,但应该能够显示一些字符串。使用System.nanoTime对函数进行计时表明,主循环和paintComponent函数都在1ms以下,这使我更加困惑。

我从根本上错过了什么吗?

1 个答案:

答案 0 :(得分:1)

如何首先将字符串绘制到BufferedImage中?

BufferedImage bi = new BufferedImage(pane.getSize().width, pane.getSize().height, BufferedImage.TYPE_INT_RGB);
Graphics2D g2D = bi.createGraphics();
g2D.drawString("HALLO", 50, 50);
...
g2D.dispose();

缓存它,然后在paintComponent()中绘制图像

g2D.drawImage(bi, 0, 0, this);