使用JavaFX8移动节点时出现奇怪的帧速率下降
我在从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下运行它,您应该(?)看到这个奇怪的下降 我真的不知道我是否在做一些我不应该做的事情,但是这个例子很简单,所以如果你能启发我或者尝试一下,告诉我你是否得到了同样的结果,那就太好了 提前谢谢使用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出现了一个小问题 每隔大约
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也有同样的效果。