我正在尝试使用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以下,这使我更加困惑。
我从根本上错过了什么吗?
答案 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);