Bad DropShadow performance
Kevin Rushforth
kevin.rushforth at oracle.com
Thu Oct 4 23:58:31 UTC 2018
Glad you were able to fix your issue. If you don't need to apply the
effect to the group with the animating content, then it will be able to
be cached, which is where I guess the speedup is coming from.
-- Kevin
On 10/4/2018 1:44 PM, Tom Schindl wrote:
> 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.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