我正在尝试使用 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/