首页 / JAVA / JavaFX动画 – 性能恶化
JavaFX动画 – 性能恶化
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了JavaFX动画 – 性能恶化,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3700字,纯文字阅读大概需要6分钟。
内容图文
![JavaFX动画 – 性能恶化](/upload/InfoBanner/zyjiaocheng/774/ae8b07c1e10241489e76fe2d20326144.jpg)
参见英文答案 > Optimizing memory leakage in JavaFX 2个
我创建了一个多个文本节点的动画.用户应该在从服务器接收文本时读取文本.问题是在几分钟(大约5分钟)内,性能开始下降.从60 fps到30 fps及以下.因此,文本很难阅读.
编辑2:
我创建了一个Minimal,Complete和Verifiable示例:
项目中有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以下.我的CPU是i5-4440 CPU(3.10GHz×4).问题发生在我测试过的每个平台上 – JavaFX 8,JavaFX 9和Ubuntu 16.04.
编辑3:
这个问题似乎只出现在Linux平台上.
然而,即使在Windows上,当我经常通过Platform.runLater方法访问JavaFX线程时,动画似乎也不流畅,即使它保持在60fps.有人知道如何改进吗?
谢谢,Jan
解决方法:
看起来您的Linux硬件加速在JavaFX渲染方面存在一些问题.我在具有类似功能的机器上没有遇到性能问题.
尝试在仅软件模式下运行代码:
java -Dprism.order=j2d -jar myfxapp.jar
内容总结
以上是互联网集市为您收集整理的JavaFX动画 – 性能恶化全部内容,希望文章能够帮你解决JavaFX动画 – 性能恶化所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。