Я пытаюсь отобразить некоторую основную информацию в окне, используя 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;
}
}
Я работаю на Raspberry Pi 3B +, который не очень быстрый компьютер, но должен иметь возможность отображать некоторыестроки. Синхронизация функций с использованием System.nanoTime
показывает, что как основной цикл, так и функция paintComponent
меньше 1 мс, что добавляет мне еще больше путаницы.
Я что-то упустил?