Приложение JavaFX отстает с использованием многопоточности - PullRequest
0 голосов
/ 17 января 2019

У меня есть приложение, целью которого является симуляция гонки N гонщиков (темы). Запуск этого приложения на моем рабочем столе с Win10 работает отлично, однако на моем ноутбуке с Ubuntu 18.04 приложение значительно отстает.

Я не уверен в причине этой ситуации, но я думаю, что это может быть что-то не так с моим кодом. Каждый отдельный поток вызывается службой Executor в контроллере, а потоки представляются в пользовательском интерфейсе с помощью ProgressBars. Я прочитал много тем с такими же проблемами здесь, и я изменил свой метод Call (). А именно, я реализовал Platform.runLater () для обновления моих ProgressBars, но, к сожалению, это ничего не изменило.

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;
}

Я надеюсь, что кто-нибудь сможет объяснить мне, где я ошибаюсь или в чем причина этих ужасных лагов?

EDIT: Методы, где я запускаю темы:

public void startButtonClicked() {
    for (RallyRacer r : rallyRacers) {
        futures.add(executorService.submit(r));
    }
    new Thread(task).start();

    executorService.shutdown();
}

public void initialize(URL location, ResourceBundle resources) {
    this.executorService = Executors.newFixedThreadPool(15);
    this.futures = new ArrayList<>();
    this.rallyRacers = new ArrayList<>();
    for(int i = 0; i < 15; i++) {
        rallyRacers.add(new RallyRacer());
    }
}

1 Ответ

0 голосов
/ 18 января 2019

Если речь идет в основном о отслеживании / отображении прогресса гонщиков в пользовательском интерфейсе, я бы порекомендовал подумать о более длительном времени сна:

  1. Человеческий глаз не распознает визуальные изменения со скоростью 1 мс. В этот момент я бы сделал несколько изменений в секунду, что-то вроде обычной частоты кадров фильма. Это будет по крайней мере 20 кадров (то есть обновлений или новых изображений) в секунду, до 50 или 60 для высокой визуальной производительности.

  2. JavaFX использует собственную «частоту кадров». Инфраструктура JavaFX обновляет состояние интерфейса пользователя примерно 60 раз в секунду - не более. Таким образом, просто излишне обновлять индикатор выполнения 1000 раз в секунду.

Может быть, вы хотите попробовать время сна десять или 20 мс или даже больше. Я бы сказал, что общая производительность приложения улучшается.

...