JavaFX — бессмысленный (CSS) эффект тени, резко снижающий производительность графики

Hello, People [...]

???? Резюме

  • Всякий раз, когда я использую Shadow-effect на моем BorderPane или любой компонент/элемент управления /Element, производительность 3D-графики (как показано в разделе Предварительный просмотр ниже) становится слишком низкой.

  • Запутанная часть заключается в том, что он даже имеет низкую производительность, когда эффект применяется к чему-то, что на самом деле не имеет ничего общего с моей вкладкой, подсценой или даже моим перемещением. Кнопка, в некотором роде [...]

  • Я использую jdk-12.0.1.

????️ Предварительный просмотр

демонстрация / предварительный просмотр .GIF

⚠️ Воссоздание проблемы

Необходимые файлы:

App.java | main.fxml | AnchorPane.css | MathUtils.java | SimpleFPSCamera.java

???? Общий код

(Для получения дополнительной информации вы также можете обратиться к разделу Восстановление проблемы)

AnchorPane.css

#BorderPane1 {
    -fx-effect: dropshadow(three-pass-box, rgb(26, 26, 26), 50, 0.6, 0, 0); /* Comment it*/
}

App.java

public class App extends Application {
    @FXML
    
    public Parent root;
    public TabPane TabPane1;
    public BorderPane BorderPane1;
    
    public static void main(String[] args) throws Exception {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) throws Exception {

        FXMLLoader loader = new FXMLLoader(getClass().getResource("main.fxml"));
        loader.setController(this);

        root = loader.load();
        Scene RootScene = new Scene(root, 1120, 540);

        primaryStage.setScene(RootScene);

        Thread t = new Thread() {
            public void run() {

                //Setting NewButton2
                Button NewButton2 = new Button();

                NewButton2.setId("Button2");
                NewButton2.setText("test2");
                NewButton2.setPrefWidth(150);
                NewButton2.setPrefHeight(50);
                NewButton2.setTranslateX(-75);
                NewButton2.setTranslateY(-25);
                NewButton2.setTranslateZ(900);

                // Setting group
                Group SubRootGroup = new Group(NewButton2);

                SubRootGroup.setTranslateX(0);
                SubRootGroup.setTranslateY(0);
                SubRootGroup.setTranslateZ(0);

                // Setting Scene
                SubScene SubScene1 = new SubScene(SubRootGroup, 0, 0, true, SceneAntialiasing.BALANCED);

                SubScene1.setId("SubScene1");
                SubScene1.setFill(Color.WHITE);
                SubScene1.heightProperty().bind(RootScene.heightProperty());
                SubScene1.widthProperty().bind(RootScene.widthProperty());

                // Initializing Camera
                SimpleFPSCamera SimpleFPSCam = new SimpleFPSCamera();
                
                // Setting Camera To The Scene
                SubScene1.setCamera(SimpleFPSCam.getCamera());

                // Adding Scene To Stage-TabPane.Tab(0)
                TabPane1.getTabs().add(new Tab("Without Shadows"));
                TabPane1.getTabs().get(0).setContent(SubScene1);

                // Loading Mouse & Keyboard Events
                SimpleFPSCam.loadControlsForSubScene(SubScene1);
            }
        };
        t.setDaemon(true);
        t.run();

        primaryStage.show();

    }
}

Вещи, которые я пробовал до сих пор

setCache(true);
setCacheShape(true);
setCacheHint(CacheHint.SPEED);

(я пытался использовать его со всеми компонентами, но безуспешно [это может быть и мое плохое знание javaFX, [неправильное использование?] ])

  • ...

???? Окончание

Есть идеи? Заранее спасибо, любая помощь будет высоко оценена, ???? [...]
Джордж.


person Giorgos Xou    schedule 30.10.2019    source источник


Ответы (1)


Скорее всего, вы уже поняли это, но, поскольку я тоже ломал голову над этой же проблемой в прошлом, вот ваш ответ:

Эффект тени «дорогой» и рисуется медленно. Если вы используете его на узле со многими потомками и перемещаете любого из потомков, это приведет к пересчету эффекта на родителя, поэтому вся анимация станет медленной (независимо от того, анимирован сам родитель или нет).

Я решил эту проблему, используя StackPane в качестве самого верхнего контейнера, к которому я добавил панель в качестве первого дочернего элемента (с эффектом отбрасывания тени css) и обычный контейнер верхнего уровня для фактических элементов управления в качестве второго дочернего элемента.

Таким образом, панель «тени» не обновляется, когда что-то анимируется вниз по дереву макета, и, вуаля, у вас есть работающий эффект тени без снижения производительности :-)

person Dimitris Kazakos    schedule 29.04.2020