2016-05-11 4 views
4

Итак, я заметил что-то о частоте кадров/гладкости моей анимации. Анимация несколько прерывистая. Тем не менее, после выполнения тестирования тестирования, я заметил, что он снова становится гладким, как только я запускаю событие изменения размера, будь то только 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) 
    } 
} 
+0

Для меня анимация не является гладкой, независимо от ширины окна в хакере в вопросе Аспергера (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

+0

@jewelsea Это действительно странно. Возможно, это не аппаратное ускорение. Что-то определенно неправильно с этим код, потому что я просто рисую простой треугольник – Asperger

+0

Это не должно быть так, и поднятые голоса указывают на то, что, возможно, у других возникла одна и та же проблема. по сравнению с предыдущими версиями JavaFX, но, по моему опыту, эти проблемы были исправлены, и я не видел, чтобы это было реплицировано через некоторое время. Возможно, вы захотите [указать отчет об ошибке] (http://bugreport.java.com). Для отчета об ошибке вам не нужно включать код для GridPane и элементов управления, поскольку проблема реплицируется без этого, вам просто нужен движущийся прямоугольник. – jewelsea

ответ

1

Проверено на Mac OS X 10.11.4, Java 1.8.0_92, NVIDIA GeForce 9400, не экономия энергии.

И example показано, используя Timeline, и это example, используя PathTransition, начинают прерывисто. Впоследствии они оба сглаживаются после одного цикла автоматического обратного хода. Используя параметр -Xint, который «запускает приложение в режиме только для интерпретации», как показано на рисунке here, значительно уменьшает начальное заикание, особенно после второго прогона. Задержки из-за непродолжительных компиляторов компилятора могут быть преувеличены, если приложение остается ограниченным одним ядром или анимация создает цикл занятости, который не достигает безопасного места, как показано на рисунке here.

+0

Где я могу добавить это? java -Xint -cp build/classes overflow.AnimationTest – Asperger

+0

'-Xint' - это опция командной строки' java'; IDE обычно позволяет установить его как свойство времени выполнения. – trashgod

Смежные вопросы