Hello, People [...]
[每当我在Shadow-effect或任何组件/控件/元素上使用BorderPane时,3D图形性能(如在下面的[[Preview部分中看到的]]都变得太低了。
“令人困惑”
👁️预览
⚠️重现问题
所需文件:
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的较差知识,[以错误的方式使用它?]]]
...
投影效果很“贵”,绘制效果很慢。如果在具有许多后代的节点上使用它并移动任何后代,这将导致在父级上重新计算效果,因此整个动画会变慢(无论父级本身是否设置了动画)。] >
我通过使用StackPane作为最顶层的容器来解决此问题,在其中向我添加了Pane作为第一个孩子(具有css下拉阴影效果),而将实际控件的普通顶层容器作为第二个孩子孩子。
这样,当某些内容在布局树中向下移动时,“阴影”窗格不会更新,瞧,您具有有效的阴影效果,而不会影响性能:-)