Java2D的drawString很慢?

标签 java swing graphics awt java-2d

我正在尝试使用 Java Swing/AWT 2D Graphics 在窗口中显示一些非常基本的信息。此时,我只是绘制一些字符串,但是虽然这个任务看起来并不难,但运行速度却非常慢。

在不绘制任何内容时,我可以以 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 函数都低于 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);

关于Java2D的drawString很慢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58165188/

相关文章:

java - 在Java中构造函数之前初始化最终变量

java - 如何让 vaadin 组件同时选择日期和时间

java - JMenuItem仅由键盘输入触发,而不是点击

java - Hibernate 抓取条件被忽略

java - 用于验证计算器正确输入的正则表达式

java - 在 Swing 中拖动时闪烁

java - 给 JPanel 一个基于百分比的宽度

javascript - 为区域构建具有可选和不同背景(颜色和图像填充)的复杂图像映射

java - 如何添加带有按钮的新 JFrame?

python - 如何在 PyQt5 中更新窗口?