使用JavaFX的简单Java方形动画并不流畅,为什么?

所以我注意到了一些关于动画的帧率/平滑度的东西.动画有点不稳定.但是,在进行了测试后,我发现只要触发调整大小事件就会再次变得平滑,不过只有0.1像素.我安装了最新的
Java.

我不能使用vsync,除非它的opengl似乎javafx正在使用三重bugger或其他东西.无论哪种方式,表现都非常糟糕.我的Windows机器非常好,并且在最新版本上.

所以在我调用show()函数后,我添加了:

Window.setWidth(Window.getWidth() + 0.1)

问题解决了,但我当然想知道幕后发生了什么,如何在不诉诸这种原始黑客的情况下真正解决这个问题?

JavaFX Canvas Double Buffering

我的代码如下:

import javafx.animation.KeyFrame;
import javafx.animation.KeyValue;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.util.Duration;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.scene.control.Button;

public class Gui extends Application{

    Stage Window;

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

    @Override
    public void start(Stage primaryStage) throws Exception {

        Window = primaryStage;
        Window.setTitle("Gui Tester");

        Group root = new Group();
        Rectangle box = new Rectangle(0, 0, 50,50);
        box.setFill(Color.GREEN);
        KeyValue x = new KeyValue(box.xProperty(), 900);
        KeyFrame keyFrame = new KeyFrame(Duration.millis(3000), x);
        Timeline timeline = new Timeline();
        timeline.setCycleCount(Timeline.INDEFINITE);
        timeline.setAutoReverse(true);
        timeline.getKeyFrames().add(keyFrame);
        timeline.play();
        root.getChildren().add(box);

        GridPane grid = new GridPane();
        grid.setVgap(8);

        root.getChildren().add(grid);

        Button newGame = new Button("START NEW GAME");

        GridPane.setConstraints(newGame, 1, 1);

        Button continueGame = new Button("CONTINUE");
        GridPane.setConstraints(continueGame, 1, 2);

        grid.getChildren().addAll(newGame, continueGame);

        Scene scene = new Scene(root, 1000, 1000);
        scene.getStylesheets().add("tester.css");
        Window.setScene(scene);
        Window.show();
        Window.setWidth(Window.getWidth() + 0.1)
    }
}

最佳答案 在Mac OS X 10.11.4,Java 1.8.0_92,NVIDIA GeForce 9400上测试,没有节能.

使用Timeline显示的example和使用PathTransition的这个example都开始不稳定.随后,它们在大约一个自动反转循环后平滑.使用-Xint选项,如“here所示,以仅解释模式运行应用程序”,显着减少了初始卡顿,特别是在第二次运行之后.如果应用程序仍局限于单个核心或动画创建无法达到安全点的繁忙循环,则由于即时编译器开销导致的延迟可能会被夸大,如here所示.

点赞