通过从JDK 7切换到JDK 8(从JavaFx 2到8),我遇到了一种奇怪的行为。 我对JavaFX很陌生,我试图制作一个简单的游戏来尝试它。
我使用 AnimationTimer 进行游戏循环,我通过设置其translateX和Y来移动矩形,具体取决于从 long now 值计算的增量值。处理方法。
使用Javafx 2时我没有遇到任何问题,其中delta的长度约为16 ms,并且运动流畅。 然后我意识到我没有使用JDK 8,并且在切换之后,delta出现了一个小问题。
每差不多20帧, delta达到32 ms ,然后矩形移动到那个点,这在屏幕上非常明显,就像矩形有点摇晃一样
我尝试过使用 TimeLine 或我自己的线程(使用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);
}
}