Bad DropShadow performance
Tom Schindl
tom.schindl at bestsolution.at
Thu Oct 4 20:44:07 UTC 2018
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
>
--
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