Java2D drawString очень медленно? - PullRequest
       122

Java2D drawString очень медленно?

0 голосов
/ 30 сентября 2019

Я пытаюсь отобразить некоторую основную информацию в окне, используя 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 мс, что добавляет мне еще больше путаницы.

Я что-то упустил?

1 Ответ

1 голос
/ 30 сентября 2019

Как насчет рисования ваших строк в 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);
...