Почему `Stage # show` такой медленный и что можно сделать для его ускорения

В JavaFX первый раз показывается этап сStage#show занимает много времени. Я не говорю о времени, которое требуется для загрузки FXML (что совсем другое дело), ​​а просто о времени, которое требуется между вызовамиStage#show и возврат вызова (и окно, показанное пользователю).

Я создал этот пример приложения, которое создает случайную сцену с несколькими вкладками, панелями сетки и представлениями таблицы, а затем время, необходимое для вызоваStage#show:

package sample;

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

import java.util.Random;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        primaryStage.setTitle("Speed test");
        primaryStage.setScene(createScene(3, 3, 6, 8));
        long start = System.nanoTime();
        primaryStage.show();
        long end = System.nanoTime();
        System.out.println("Total seconds: " + ((double) (end - start)) / 1000000000);
    }

    private Scene createScene(int tabs, int rows, int columns, int tableColumns) {
        TabPane tp = new TabPane();
        for (int t = 0; t < tabs; t++) {
            GridPane gp = new GridPane();
            for (int r = 0; r < rows; r++) {
                for (int c = 0; c < columns; c++) {
                    gp.add(getRandomControl(), c, r);
                }
            }
            TableView<Object> tv = new TableView<>();
            for (int i = 0; i < tableColumns; i++)
                tv.getColumns().add(new TableColumn<>(getRandomString()));

            VBox vb = new VBox(gp, tv);
            tp.getTabs().add(new Tab(getRandomString(), vb));
        }
        return new Scene(tp);
    }

    private final String[] randomStrings = new String[]{
            "foo",
            "bar",
            "baz",
            "lorem",
            "ipsum",
            "dolor",
            "sit",
            "amet",
            "adipiscing",
            "elit",
            "morbi",
            "quis",
            "tempus",
            "justo",
            "faucibus",
            "justo",
            "risus",
            "nec",
            "commodo",
            "sem",
            "congue"
    };

    private final Random random = new Random();

    private String getRandomString() {
        return randomStrings[random.nextInt(randomStrings.length)];
    }

    private Control getRandomControl() {
        switch (random.nextInt(4)) {
            case 0:
                return new Label(getRandomString());
            case 1:
                return new TextField();
            case 2:
                return new PasswordField();
            case 3:
                ComboBox<String> cb = new ComboBox<>();
                cb.getItems().addAll(randomStrings);
                return cb;
            default:
                return null;
        }
    }


    public static void main(String[] args) {
        launch(args);
    }
}

Мои результаты, конечно, различаются, но они всегда составляют около 1,2 секунды, что не очень много, но, безусловно, заметно и не слишком ожидаемо, учитывая, что моя машина загружает сравнительно сложные пользовательские интерфейсы за долю этого времени (как пока они не написаны на JavaFX, то есть).

Итак, мой вопрос - что является причиной плохой работы? Есть ли какие-то хитрости или хитрости, чтобы минимизировать это время, подобное тому, что делается для ускорения загрузки FXML?

Ответы на вопрос(0)

Ваш ответ на вопрос