Как я могу максимизировать скорость рендеринга панели и ее компонентов? - PullRequest
1 голос
/ 14 апреля 2020

Я создал простой экран spla sh, который в основном представляет собой JFrame с фоновым изображением, два JLabels и JProgressbar. Когда я отрисовываю кадр только с фоновым изображением, это занимает около 200 миллисекунд, что является хорошим временем для экрана spla sh.

Но как только я добавляю JLabel (используя шрифт Sansserif), это занимает две секунды! Поэтому создание строки в 9 раз интенсивнее, чем рендеринг изображения.

Как уменьшить скорость рендеринга JLabels или панели?

private static final Dimension LOADINGSCREEN_DIMENSION = new Dimension(400, 400);

private LoadingScreen() {
    super();
    this.setUndecorated(true);
    this.setResizable(false);
    this.setLayout(new BorderLayout(0, 0));
    this.setSize(LOADINGSCREEN_DIMENSION);
    this.setPreferredSize(LOADINGSCREEN_DIMENSION);
    this.setContentPane(createContentPane());

    //UNCOMMENT THIS LINE and it will take about 2 seconds to create
    //this.add(createInformationLabel(), BorderLayout.SOUTH);

    //Set location and pack
    final Dimension dim = Toolkit.getDefaultToolkit().getScreenSize();
    this.setLocation(dim.width/2-this.getSize().width/2, dim.height/2-this.getSize().height/2);
}

private JLabel createInformationLabel() {
    JLabel infoLabel = new JLabel("Label");
    infoLabel.setFont(new Font("SansSerif", Font.PLAIN, 12));
    infoLabel.setHorizontalAlignment(SwingConstants.RIGHT);
    infoLabel.setBorder(new EmptyBorder(50, 0, 10, 20));
    infoLabel.setOpaque(false);
    return infoLabel;
}

1 Ответ

0 голосов
/ 14 апреля 2020

Это не имеет никакого отношения к скорости рендеринга. Скорость рендеринга всего этого порядка десятков миллисекунд.

Снижение производительности, которое вы наблюдаете, связано с загрузкой классов. Прежде чем JFrame может быть визуализирован, его класс должен быть загружен, и все классы, от которых он зависит, и так далее, и так далее. Тогда вы создаете экземпляр JLabel. Этот класс должен быть загружен, и все классы, от которых он зависит. Затем вы создаете экземпляр Font, поэтому необходимо загрузить все классы, связанные со шрифтами. Я не знаю, но может даже иметь место некоторая «инициализация шрифтовой подсистемы». Вы получаете изображение.

Таким образом, в настоящее время вы не можете избежать этих накладных расходов.

Вы можете попробовать пропустить метку и сделать текст самостоятельно, используя «графику», но я не могу обещать, что вы увидите любое улучшение таким образом.

Вы также можете посмотреть на компонент SplashScreen, можно надеяться, что он будет оптимизирован, чтобы задействовать как можно меньше классов, чтобы загружаться как можно быстрее насколько возможно, но у меня нет опыта с этим. И, возможно, вы не сможете добавить к нему текст, либо с помощью JLabel, либо отрисовав его самостоятельно, либо, если вы это сделаете, вы, вероятно, будете страдать от всех накладных расходов, которые вы испытываете в настоящее время.

...