有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java JavaFX FadeTransition消耗大量GPU

我在画同心圆的画布上应用淡入效果。问题是它消耗了大量的GPU。我尝试了在这个efficient javafx fadetransition链接中给出的解决方案,但没有成功。有人能告诉我我在这里错过了什么吗

package sample;

import javafx.animation.Animation;
import javafx.animation.FadeTransition;
import javafx.animation.Transition;
import javafx.application.Application;
import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.scene.Scene;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;
import javafx.util.Duration;


public class Main extends Application {
    Pane pane;
    Canvas canvas;
    double transX = 0.0, transY = 0.0;

    public void draw() {
        GraphicsContext gc = canvas.getGraphicsContext2D();
        gc.clearRect(canvas.getLayoutX(), canvas.getLayoutY(), canvas.getWidth(), canvas.getHeight());
        gc.setStroke(Color.FIREBRICK);
        gc.setFill(Color.TRANSPARENT);
        gc.setLineWidth(2.0);

        for(int i = 1; i <= 5; ++i) {
            double r = 100 * i;
            gc.fillOval(pane.getWidth() / 2 - r + transX, pane.getHeight() / 2 - r + transY, 2 * r, 2 * r);
            gc.strokeOval(pane.getWidth() / 2 - r + transX, pane.getHeight() / 2 - r + transY, 2 * r, 2 * r);
        }
    }

    @Override
    public void start(Stage primaryStage) {
        pane = new Pane();
        canvas = new Canvas();
        canvas.layoutXProperty().bind(pane.layoutXProperty());
        canvas.layoutYProperty().bind(pane.layoutYProperty());
        canvas.widthProperty().bind(pane.widthProperty());
        canvas.heightProperty().bind(pane.heightProperty());

        pane.widthProperty().addListener((observableValue, number, t1) -> draw());

        pane.heightProperty().addListener((observableValue, number, t1) -> draw());

        pane.getChildren().addAll(canvas);

        FadeTransition ft1 = new FadeTransition(Duration.seconds(1), canvas);
        ft1.setFromValue(0.25);
        ft1.setToValue(1);
        ft1.setCycleCount(Animation.INDEFINITE);
        ft1.setAutoReverse(true);
        ft1.play();


        /*DoubleProperty opacity = new SimpleDoubleProperty();
        Transition opacityTransition = new Transition() {
            {
                setCycleDuration(Duration.seconds(1));
            }
            protected void interpolate(double frac) {
                opacity.set(frac);
            }
        };

        canvas.opacityProperty().bind(opacity);
        opacityTransition.setAutoReverse(true);
        opacityTransition.setCycleCount(Animation.INDEFINITE);
        opacityTransition.play();*/
        
        primaryStage.setScene(new Scene(pane, primaryStage.getWidth(), primaryStage.getHeight()));
        primaryStage.setTitle("Canvas Demo");
        primaryStage.setMaximized(true);
        primaryStage.show();
    }


    public static void main(String[] args) {
        Application.launch(args);
    }
}

共 (0) 个答案