Hi Kevin, Thank you for the comment so the trick to fix my problems is that I don't apply the effect on the container but create a 2nd node who has the same size and is a sibling of my area and apply the effect there?
This looks like it is working ;-) package fxbugs; import javafx.animation.ScaleTransition; import javafx.application.Application; import javafx.scene.Node; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.effect.BlurType; import javafx.scene.effect.DropShadow; import javafx.scene.layout.AnchorPane; import javafx.scene.layout.GridPane; import javafx.scene.layout.Region; import javafx.scene.paint.Color; import javafx.stage.Stage; import javafx.util.Duration; public class DropShadowPerformance extends Application { @Override public void start(Stage primaryStage) throws Exception { AnchorPane p = new AnchorPane(); // // Use a shadow Region shadow = new Region(); shadow.setStyle("-fx-background-color: black;"); shadow.setEffect(new DropShadow(BlurType.GAUSSIAN, Color.rgb(0, 0, 0, 0.3), 10, 0.5, 0, 0)); shadow.setCache(true); AnchorPane.setBottomAnchor(shadow, 30.0); AnchorPane.setTopAnchor(shadow, 30.0); AnchorPane.setLeftAnchor(shadow, 30.0); AnchorPane.setRightAnchor(shadow, 30.0); p.getChildren().add(shadow); GridPane container = new GridPane(); container.setHgap(10); container.setVgap(10); container.setStyle("-fx-background-color: green; -fx-padding: 10;"); // container.setEffect(new DropShadow(BlurType.GAUSSIAN, Color.rgb(0, 0, 0, 0.3), 10, 0.5, 0, 0)); for( int i = 0; i < 8; i++ ) { for( int j = 0; j < 14; j++ ) { container.add(createButton(), i, j); } } AnchorPane.setBottomAnchor(container, 30.0); AnchorPane.setTopAnchor(container, 30.0); AnchorPane.setLeftAnchor(container, 30.0); AnchorPane.setRightAnchor(container, 30.0); p.getChildren().add(container); Scene s = new Scene(p, 800, 600); primaryStage.setScene(s); primaryStage.show(); } private Node createButton() { Button button = new Button("hello world"); button.hoverProperty().addListener((ob,ol,ne) -> { ScaleTransition t = new ScaleTransition(Duration.millis(500), button); if( ne ) { t.setFromX(1); t.setFromY(1); t.setToX(1.2); t.setToY(1.2); } else { t.setFromX(1.2); t.setFromY(1.2); t.setToX(1); t.setToY(1); } t.play(); }); return button; } public static void main(String[] args) { launch(args); } } Tom On 04.10.18 22:08, Kevin Rushforth wrote: > Any effect has the potential for slowing down depending on the size if > the node being rendered, since it is done as an image operation on the > entire area (bounding box) covered by the Parent. Have you noticed > whether DropShadow is worse than other effects, say, GaussianBlur? One > other thing to note is that caching a Parent will have no effect if the > children are animating, since it will need to be recreated each time. > > -- Kevin > > > On 10/4/2018 11:32 AM, Dirk Lemmermann wrote: >> Yes, I also noticed that DropShadow causes severe performance >> degradation. >> >> Dirk >> >>> On 4 Oct 2018, at 13:10, Tom Schindl <tom.schi...@bestsolution.at> >>> wrote: >>> >>> Hi, >>> >>> Why does applying a DropShadow on a large region cause problem when >>> animating nodes contained in that region? >>> >>>> package fxbugs; >>>> >>>> import javafx.animation.ScaleTransition; >>>> import javafx.application.Application; >>>> import javafx.geometry.Insets; >>>> import javafx.scene.Node; >>>> import javafx.scene.Scene; >>>> import javafx.scene.control.Button; >>>> import javafx.scene.effect.BlurType; >>>> import javafx.scene.effect.DropShadow; >>>> import javafx.scene.layout.BorderPane; >>>> import javafx.scene.layout.GridPane; >>>> import javafx.scene.paint.Color; >>>> import javafx.stage.Stage; >>>> import javafx.util.Duration; >>>> >>>> public class DropShadowPerformance extends Application { >>>> >>>> @Override >>>> public void start(Stage primaryStage) throws Exception { >>>> BorderPane p = new BorderPane(); >>>> p.setPadding(new Insets(30)); >>>> >>>> GridPane container = new GridPane(); >>>> container.setHgap(10); >>>> container.setVgap(10); >>>> container.setStyle("-fx-background-color: green; >>>> -fx-padding: 10;"); >>>> container.setEffect(new DropShadow(BlurType.GAUSSIAN, >>>> Color.rgb(0, 0, 0, 0.3), 10, 0.5, 0, 0)); >>>> for( int i = 0; i < 8; i++ ) { >>>> for( int j = 0; j < 14; j++ ) { >>>> container.add(createButton(), i, j); >>>> } >>>> } >>>> p.setCenter(container); >>>> >>>> Scene s = new Scene(p, 800, 600); >>>> primaryStage.setScene(s); >>>> primaryStage.show(); >>>> } >>>> >>>> private Node createButton() { >>>> Button button = new Button("hello world"); >>>> button.hoverProperty().addListener((ob,ol,ne) -> { >>>> ScaleTransition t = new >>>> ScaleTransition(Duration.millis(500), button); >>>> >>>> if( ne ) { >>>> t.setFromX(1); >>>> t.setFromY(1); >>>> t.setToX(1.2); >>>> t.setToY(1.2); >>>> } else { >>>> t.setFromX(1.2); >>>> t.setFromY(1.2); >>>> t.setToX(1); >>>> t.setToY(1); >>>> } >>>> >>>> t.play(); >>>> }); >>>> return button; >>>> } >>>> >>>> public static void main(String[] args) { >>>> launch(args); >>>> } >>>> } >>> >>> If you run the following application: >>> * Maximize the window >>> * Hover over a button (eg the one in the right lower corner) >>> >>> You'll notice that the animation is not smooth, setting cache flags on >>> the container does not improve the situation, nor does using a >>> ONE_PASS_BOX. >>> >>> Removing the effect on the container node "fixes" the problem. >>> >>> This is on a MacBook Pro and Windows Surface both having a Intel Iris >>> Plus 650 graphics card. >>> >>> Tom >>> >>> -- >>> Tom Schindl, CTO >>> BestSolution.at EDV Systemhaus GmbH >>> Eduard-Bodem-Gasse 5-7. A-6020 Innsbruck >>> Reg. Nr. FN 222302s am Firmenbuchgericht Innsbruck > -- Tom Schindl, CTO BestSolution.at EDV Systemhaus GmbH Eduard-Bodem-Gasse 5-7. A-6020 Innsbruck Reg. Nr. FN 222302s am Firmenbuchgericht Innsbruck