Итак, я заметил что-то о частоте кадров/гладкости моей анимации. Анимация несколько прерывистая. Тем не менее, после выполнения тестирования тестирования, я заметил, что он снова становится гладким, как только я запускаю событие изменения размера, будь то только 0,1 px. У меня установлена новая Java.Простая Java-анимация с JavaFX не гладкая, почему?
Я не могу работать с vsync, если его opengl и кажется, что javafx использует тройной глюк или что-то в этом роде. В любом случае производительность очень плохая. Моя машина для окон довольно хороша и в самой новой версии.
Таким образом, после моего вызова функции шоу() Я добавил:
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)
}
}
Для меня анимация не является гладкой, независимо от ширины окна в хакере в вопросе Аспергера (Java 8u66, OS X 10.9.5, 2015 15 «MacBook Pro с Nvidia GT 750 м). Я попробовал пару настроек отладки' - Djavafx.pulseLogger = true -Dprism.vsync = false -Dprism.order = sw' и добавление слушателя к свойствам ящиков x, чтобы увидеть, существует ли временной интервал между импульсами или скачок в позиции x, но не произошло (т. Е. деления времени и движения были гладкими). Однако движение прямоугольника на экране было изредка неустойчивым и неустойчивым (я не знаю, почему). – jewelsea
@jewelsea Это действительно странно. Возможно, это не аппаратное ускорение. Что-то определенно неправильно с этим код, потому что я просто рисую простой треугольник – Asperger
Это не должно быть так, и поднятые голоса указывают на то, что, возможно, у других возникла одна и та же проблема. по сравнению с предыдущими версиями JavaFX, но, по моему опыту, эти проблемы были исправлены, и я не видел, чтобы это было реплицировано через некоторое время. Возможно, вы захотите [указать отчет об ошибке] (http://bugreport.java.com). Для отчета об ошибке вам не нужно включать код для GridPane и элементов управления, поскольку проблема реплицируется без этого, вам просто нужен движущийся прямоугольник. – jewelsea