2015-12-17 3 views
1

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

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

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

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

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

Показать все изображения, которые иллюстрируют неполадку.

Normal mode, no video playing

Bugged mode, while video playing

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

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

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

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

Отключение анимации заливки progressbar также не помогает.

ответ

1

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

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

Platform.runLater(() -> { 
    arc.setStartAngle(30); 
    arc.setLength(45); 
} 
Смежные вопросы