JavaFX - "Pointless" (CSS) 阴影效果,显着降低图形性能
JavaFX - "Pointless" (CSS) Shadow Effect, Drastically decrices Graphics Performance
Hello, People [...]
总结
每当我使用 Shadow-effect on my BorderPane 或任何 Component/control/Element 时,3D 图形性能 (如图所示,在 Preview 下面的部分) 太低了。
“令人困惑” 部分是,当效果 应用 时,它甚至会变得低性能确实与我的 Tab、Subscene 甚至我的移动按钮都没有关系,在某种程度上 [...]
我用jdk-12.0.1.
️预览
⚠️ 重现问题
需要的文件:
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();
}
}
到目前为止我尝试过的事情
- javafx animation poor performance consumes all my cpu
setCache(true);
setCacheShape(true);
setCacheHint(CacheHint.SPEED);
(我已经尝试将它与所有组件一起使用但没有成功[这也可能是我对 javaFX 的了解不足,[以错误的方式使用它?]])
- ...
结局
有什么想法吗?提前致谢,非常感谢任何帮助,[...]
乔治.
很可能,你现在已经明白了,但由于我过去也曾为同样的问题苦苦思索过,这里是你的答案:
投影效果"expensive",绘制速度较慢。如果你在有很多后代的节点上使用它并移动任何一个后代,它会导致效果在parent上是re-calculated,所以整个动画变慢(不管[=28= =]本身是否有动画)。
我通过使用 StackPane 作为 top-most 容器解决了这个问题,我向其中添加了一个 Pane 作为第一个 child(具有 css drop-shadow 效果) 和实际控件的正常 top-level 容器作为第二个 child.
这样,当某些东西沿着布局树动画时,"shadow" 窗格不会更新,瞧,你有一个有效的 drop-shadow 效果,没有性能影响:-)
Hello, People [...]
总结
每当我使用 Shadow-effect on my BorderPane 或任何 Component/control/Element 时,3D 图形性能 (如图所示,在 Preview 下面的部分) 太低了。
“令人困惑” 部分是,当效果 应用 时,它甚至会变得低性能确实与我的 Tab、Subscene 甚至我的移动按钮都没有关系,在某种程度上 [...]
我用jdk-12.0.1.
️预览
⚠️ 重现问题
需要的文件:
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();
}
}
到目前为止我尝试过的事情
- javafx animation poor performance consumes all my cpu
setCache(true);
setCacheShape(true);
setCacheHint(CacheHint.SPEED);
(我已经尝试将它与所有组件一起使用但没有成功[这也可能是我对 javaFX 的了解不足,[以错误的方式使用它?]])
- ...
结局
有什么想法吗?提前致谢,非常感谢任何帮助,[...]
乔治.
很可能,你现在已经明白了,但由于我过去也曾为同样的问题苦苦思索过,这里是你的答案:
投影效果"expensive",绘制速度较慢。如果你在有很多后代的节点上使用它并移动任何一个后代,它会导致效果在parent上是re-calculated,所以整个动画变慢(不管[=28= =]本身是否有动画)。
我通过使用 StackPane 作为 top-most 容器解决了这个问题,我向其中添加了一个 Pane 作为第一个 child(具有 css drop-shadow 效果) 和实际控件的正常 top-level 容器作为第二个 child.
这样,当某些东西沿着布局树动画时,"shadow" 窗格不会更新,瞧,你有一个有效的 drop-shadow 效果,没有性能影响:-)