JavaFX应用程序落后于多线程

时间:2019-01-17 14:53:03

标签: java multithreading javafx-8

我有一个旨在模拟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;
}

1 个答案:

答案 0 :(得分:0)

如果主要是为了在UI上跟踪/显示赛车手的进度,我建议考虑延长睡眠时间:

  1. 人眼无法以1毫秒的速度识别视觉变化。在这一点上,我每秒会进行许多更改,类似于电影的通常帧速率。为了获得较高的视觉效果,每秒至少需要20帧(即更新或新图像),最多50或60帧。

  2. JavaFX使用它自己的“帧速率”。 JavaFX框架以大约60次/秒的速度更新UI状态-不多。因此,将进度条每秒更新1000次实在是太过分了。

也许您想尝试10或20毫秒,甚至更长的睡眠时间。我想请问一下,应用程序的整体性能会提高。