我有一个旨在模拟N个赛车手(线程)比赛的应用程序。在装有Win10的台式机上运行此应用程序可完美运行,但是在装有Ubuntu 18.04应用程序的笔记本上运行该应用程序的情况却严重滞后。
我不确定这种情况的原因,但是我想我的代码可能有问题。控制器中的Executor Service调用每个单个线程,UI中的线程由ProgressBars表示。我在这里阅读了很多具有相同问题的主题,并且更改了Call()方法。即,我已经实现了Platform.runLater()来在那里更新我的ProgressBar,但是不幸的是它没有做任何更改。
block()
我希望有人能向我解释我哪里错了,或者这种可怕的滞后的根源是什么?
编辑: 我启动线程的方法:
public Boolean call() {
try {
for (double i = 0; i < getRaceTime(); i += 0.01) {
final double counter = i;
final double range = getRaceTime();
Platform.runLater(() -> progressBar.setProgress(counter / range));
TimeUnit.MILLISECONDS.sleep(1);
}
} catch (InterruptedException e) {
e.printStackTrace();
}
return true;
}
答案 0 :(得分:0)
如果主要是为了在UI上跟踪/显示赛车手的进度,我建议考虑延长睡眠时间:
人眼无法以1毫秒的速度识别视觉变化。在这一点上,我每秒会进行许多更改,类似于电影的通常帧速率。为了获得较高的视觉效果,每秒至少需要20帧(即更新或新图像),最多50或60帧。
JavaFX使用它自己的“帧速率”。 JavaFX框架以大约60次/秒的速度更新UI状态-不多。因此,将进度条每秒更新1000次实在是太过分了。
也许您想尝试10或20毫秒,甚至更长的睡眠时间。我想请问一下,应用程序的整体性能会提高。