使用JavaFX8移动节点时出现奇怪的帧速率下降

使用JavaFX8移动节点时出现奇怪的帧速率下降,java,javafx-2,javafx-8,frame-rate,Java,Javafx 2,Javafx 8,Frame Rate,我在从JDK7切换到JDK8(从JavaFX2切换到8)时遇到了一个奇怪的行为。 我对JavaFX很陌生,我正在尝试制作一个简单的游戏来试用它 我使用AnimationTimer执行游戏循环,通过设置矩形的translateX和Y来移动矩形,具体取决于handle方法接收到的long now值计算出的增量 在使用JavaFX2时,我没有遇到任何问题,在JavaFX2中,增量大约是预期的16毫秒,并且运动是流动的。 然后我意识到我没有使用JDK 8,在切换之后,delta出现了一个小问题 每隔大约

我在从JDK7切换到JDK8(从JavaFX2切换到8)时遇到了一个奇怪的行为。 我对JavaFX很陌生,我正在尝试制作一个简单的游戏来试用它

我使用AnimationTimer执行游戏循环,通过设置矩形的translateX和Y来移动矩形,具体取决于handle方法接收到的long now值计算出的增量

在使用JavaFX2时,我没有遇到任何问题,在JavaFX2中,增量大约是预期的16毫秒,并且运动是流动的。 然后我意识到我没有使用JDK 8,在切换之后,delta出现了一个小问题

每隔大约20帧,增量会上升到32 ms,然后矩形在该点移动到远处,这在屏幕上非常明显,就像矩形有点摇晃一样

我尝试过不同的方法,比如使用时间线或我自己的线程(使用Platform.RunLater()),但我遇到了同样的问题。 使用setChache(true)和setCacheHint(CacheHint.SPEED)似乎也不会改变它

我也在另一台PC上尝试过,它也有同样的功能,但在Linux上,JDK 8似乎没有这个问题

我有带ATI Radeon R9 270的Windows 7 x64(如果需要) 我正在使用Netbeans

下面是一个简单的完整示例,我将从左向右移动一个矩形。通过在JDK 8下运行它,您应该(?)看到这个奇怪的下降

我真的不知道我是否在做一些我不应该做的事情,但是这个例子很简单,所以如果你能启发我或者尝试一下,告诉我你是否得到了同样的结果,那就太好了

提前谢谢

import javafx.animation.AnimationTimer;
import javafx.application.Application;
import javafx.scene.CacheHint;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class Main extends Application {

    private long previous;

    @Override
    public void start(Stage primaryStage) {

        Pane root = new Pane();
        Scene scene = new Scene(root, 800, 600);

        final Rectangle r = new Rectangle(0, 200, 50, 50);
//        r.setCache(true);
//        r.setCacheHint(CacheHint.SPEED);

        root.getChildren().add(r);

        final AnimationTimer at = new AnimationTimer() {
            @Override
            public void handle(long now) {
                if (previous != 0) {
                    final long delta = (now - previous) / 1000000;
                    r.setTranslateX(r.getTranslateX() + delta * 0.2);
                    System.out.println(delta);
                }
                previous = now;
            }
        };            
        primaryStage.setTitle("Moving test");
        primaryStage.setScene(scene);
        primaryStage.show();

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

在没有
System.out.println
调用的情况下,您是否会经历帧速率下降快速打印到控制台可能会变得昂贵。此外,您还可以稍微提高性能-而不是
+delta*0.2
您可以通过在前一行代码中除以
5000000.0
并简单地添加
delta
,将delta数据类型设置为
double
是,这样做不需要向控制台打印(我只是加上它来看看它为什么会这样做)对delta使用double也有同样的效果。