JavaFX анимация-ухудшение производительности [дубликат]



На этот вопрос уже есть ответ здесь:



Я создал анимацию нескольких текстовых узлов. Предполагается, что пользователь читает текст по мере его поступления с сервера. Проблема в том, что через несколько минут (примерно 5) производительность начинает падать. От 60 кадров в секунду до 30 кадров в секунду и ниже. Как в результате текст очень трудно читать.



Правка 2:



Я создал минимальный, полный и проверяемый пример:



В проекте есть 3 файла:



MainFxApp:



import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.text.Font;
import javafx.stage.Stage;

import java.util.List;

public class MainFxApp extends Application {

@Override
public void start(Stage primaryStage) {

Pane root = new Pane();
root.setStyle("-fx-background-color: black;");

MyAnimationTimer myAnimationTimer = new MyAnimationTimer((List<MyText>) (List<?>) root.getChildren());

MyText newText;
for (int i = 65; i < 85; i++) {
newText = new MyText("" + ((char) i));
newText.setFill(Color.GREEN);
newText.setFont(Font.font(40));
myAnimationTimer.addNode(newText);
}

Scene scene = new Scene(root, 1200, 600);

primaryStage.setTitle("Performance test");
primaryStage.setScene(scene);
primaryStage.show();

myAnimationTimer.start();


}

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


MyAnimationTimer:



import javafx.animation.AnimationTimer;
import javafx.application.Platform;
import javafx.scene.CacheHint;
import javafx.scene.Node;

import java.util.List;

public class MyAnimationTimer extends AnimationTimer {
private List<MyText> nodes;
private double panelWidth;
private double panelHeight;
private double basicVelocity; // Distance per nanosecond

private long lastFrameTime;

private long timeCount = 0;
private int frameCount = 0;

MyAnimationTimer(List<MyText> nodes) {
super();
this.nodes = nodes;
this.panelWidth = 1200;
this.panelHeight = 600;
this.setBasicVelocity();
}

@Override
public void start() {
this.lastFrameTime = System.nanoTime();
super.start();
}

@Override
public void handle(long now) {

long deltaT = now - lastFrameTime;
double deltaX = this.basicVelocity * deltaT;

for (MyText node : this.nodes) {
node.setTranslateX(node.getTranslateX() + node.direction * deltaX);
if (node.getTranslateX() < 0) {
node.direction = 1;
} else if (node.getTranslateX() > 1200) {
node.direction = -1;
}
}

this.lastFrameTime = now;

this.timeCount += deltaT;
this.frameCount++;

if (timeCount > 1000000000) {
System.out.println(this.frameCount / (double) timeCount * 1000000000);
this.frameCount = 0;
this.timeCount = 0;
}
}

void addNode(final MyText node) { // Not sure about the final thing
Platform.runLater(() -> {
node.setCache(true);
node.setCacheHint(CacheHint.SPEED);
node.setTranslateY(panelHeight / 2);

double nodePositionX = panelWidth - 20;

if (nodes.size() >= 1) {
Node lastNode = nodes.get(nodes.size() - 1);
double lastNodeEnd = lastNode.getTranslateX() + 50;
if (lastNodeEnd > nodePositionX) {
nodePositionX = lastNodeEnd;
}
}

node.setTranslateX(nodePositionX);

nodes.add(node);
});
}

private void setBasicVelocity() {
Platform.runLater(() -> {
this.basicVelocity = ((panelWidth / 4) * 3 / (double) 5000 / 1000000.0);
});
}
}


MyText:



import javafx.scene.text.Font;
import javafx.scene.text.Text;

class MyText extends Text {
int direction = -1;

MyText(String text) {
super(text);
this.setFont(new Font("Arial Regular", 40));
}
}


Даже в этом простом примере падение производительности значительно. Есть 20 узлов в сцене, и fps падает ниже 20. Мой процессор-i5-4440 CPU (3.10 GHz × 4). Проблема возникает на каждой платформе, на которой я ее тестировал - Приложение 8, Приложение 9 и Ubuntu 16.04.



Правка 3:



Проблема, по-видимому, присутствует только на платформе Linux.



Однако даже в Windows, когда я часто обращаюсь к потоку JavaFX через платформу.метод runLater анимация не кажется беглой, даже если она держится на 60 кадров в секунду. Кто-нибудь знает, как его можно улучшить?



Спасибо, Ян

569   1  

1 ответ:

Похоже, что ваше аппаратное ускорение Linux имеет некоторые проблемы с рендерингом JavaFX. Я не встретил никаких проблем с производительностью на моей машине с аналогичными возможностями.

Попробуйте запустить код в режиме только для программного обеспечения:

java -Dprism.order=j2d -jar myfxapp.jar 

Comments

    Ничего не найдено.