Анимации JavaFX мерцают

У меня есть окно, отображающее видеопоток с лентой твиттера в качестве наложения. Когда отображается новый твит, текущий твит анимируется с помощью анимации поворота, а следующий твит поворачивается в поле зрения. Анимации выполняются с использованием файла RotateTransition.

Приложение также переключается между разными камерами для отображения разных потоков. Чтобы указать, когда приложение переключается на следующую камеру, у меня есть индикатор выполнения, который заполняется с использованием объекта Timeline.

Это работает хорошо, пока я не изменю размер окна. Анимации поворота начинают мерцать вместе с индикаторами выполнения по мере их постепенного заполнения.

В качестве теста я отключил видеопоток, чтобы посмотреть, что происходит. Тогда «артефакт» не возникает, и я могу изменять размер столько, сколько захочу. Если я играю поток и не изменяю размер, все работает хорошо.

Видеоплеер основан на VLCJ, но фактические пиксели рисуются на WritableImage в Imageview.

См. следующие изображения, которые иллюстрируют проблему.

Обычный режим, видео не воспроизводится

Режим прослушивания при воспроизведении видео

В правом нижнем углу вы можете увидеть 2 разных индикатора выполнения (ProgresBar и ProgressIndicator).

Часть мерцающего результата все еще видна под вторым изображением. Каким-то образом он остается видимым, вероятно, потому, что область не перерисовывается.

Любая идея, что делает мерцание происходит? Могу ли я что-нибудь сделать, чтобы исправить или избежать этого?

Я попробовал некоторые параметры виртуальной машины в IntelliJ: -Dsun.java2d.d3d=true -Dprism.forceGPU=true, чтобы каким-то образом включить аппаратное ускорение, но это, похоже, не помогает.

Отключение анимации заполнения полосы прогресса тоже не помогает.


person ar34z    schedule 17.12.2015    source источник


Ответы (1)


У меня была аналогичная проблема с некоторыми дугами и формами, которые мерцали при изменении их атрибутов/размеров.

Решение моей проблемы заключалось в том, чтобы убедиться, что методы, используемые для изменения фигур, вызываются из потока JavaFX.

Platform.runLater(() -> {
    arc.setStartAngle(30);
    arc.setLength(45);
}
person bonfatti    schedule 05.02.2016