Bad DropShadow performance

Dirk Lemmermann dlemmermann at gmail.com
Thu Oct 4 18:32:31 UTC 2018


Yes, I also noticed that DropShadow causes severe performance degradation.

Dirk

> On 4 Oct 2018, at 13:10, Tom Schindl <tom.schindl at 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



More information about the openjfx-dev mailing list