Производительность отрисовки пути JavaFX 2

У меня есть JavaFX Group с добавленным к нему узлом Path, к которому я добавляю данные примерно 30 раз в секунду. Это приводит к тому, что весь мой графический интерфейс становится очень медленным и не отвечает примерно через минуту. Сначала я добавляю путь к Group вот так:

root.getChildren().add(path);

Данные добавляются так:

while(true) {
    // Calculate x and y...

    path.getElements().add(new LineTo(x, y));
    path.getElements().add(new MoveTo(x, y));

    // Sleep 33 milliseconds...
}

Если я не добавлю путь в группу, но все же добавлю данные после этого, графический интерфейс останется отзывчивым, поэтому проблема с производительностью, по-видимому, связана с рисованием формы пути. Почему? Что я могу сделать, чтобы улучшить производительность? Известно ли такое или я что-то не так делаю? Спасибо!


person laobeylu    schedule 04.10.2012    source источник


Ответы (1)


Существует известная проблема (создание путей выполняется очень медленно) в JavaFX 2.1, связанная с Производительность пути и другая похожая проблема, нерешенная в JavaFX 2.2 (улучшить производительность рендеринга пути) . Если вы проверите систему отслеживания проблем JavaFX, могут возникнуть и другие проблемы. Для JavaFX8, который в настоящее время находится в стадии разработки, производительность многих элементов была значительно улучшилось.

Один из альтернативных подходов, который вы можете попробовать, — это использовать Canvas, а не Путь. Однако зависит от вашего варианта использования, для некоторых вариантов использования это будет подходящей заменой, для других - нет.

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

Вы также должны проверить свою реализацию на наличие следующих вещей:

  1. Не вызывайте сон в потоке JavaFX.
  2. Не делайте ничего интенсивного для процессора в потоке JavaFX.
  3. Не выполняйте блокирующий ввод-вывод в потоке JavaFX.
  4. Не размещайте десятки тысяч узлов в SceneGraph или Path.
  5. При чтении или записи объектов в SceneGraph из другого потока используйте Platform.runLater.
  6. Не вызывайте Platform.runLater слишком часто, иначе вы перегрузите систему обработки событий.

Не говоря уже о том, что ваш код имеет какие-либо из вышеперечисленных проблем, просто нужно проверить.

person jewelsea    schedule 04.10.2012
comment
Спасибо! Я посмотрю что я могу сделать. - person laobeylu; 04.10.2012
comment
Ну, Canvas производительность, кажется, еще хуже... Я посмотрю на JDK 8 и JavaFX 8. - person laobeylu; 06.10.2012
comment
Это действительно удивительно. В этом случае Canvas должен работать намного быстрее, поскольку он сопоставляется с одним узлом SceneGraph, а не с тысячами. Проверьте свой код, возможно, есть какая-то другая проблема. - person jewelsea; 07.10.2012