JavaFX на iPhone - Laggy прокрутка ListView при применении тени

Я разрабатываю приложение для iOS с использованием JavaFXPorts. У меня есть панель, содержащая ListView со странами и их флагами. Я заметил, что прокрутка ListView тормозит, когда я применяю эффект тени к панели. Как видно из видео ниже, без эффекта прокрутка очень плавная, а при применении эффекта через CSS прокрутка начинает тормозить. Я хотел бы сохранить эффект тени, так как он делает приложение более красивым. Так что любое предложение действительно ценится.

Код CSS, который я использую:

-fx-effect: dropshadow( three-pass-box, rgba(0,0,0,0.6) , 5, 0.0 , 0 , 1);

Видео: прокрутка без эффекта тени

Видео: прокрутка с эффектом тени (Laggy)

Обратите внимание, что это на iPhone 6 работает. На iPhone 5 результаты намного хуже.


person javasuns    schedule 27.06.2016    source источник
comment
Эффекты на мобильных устройствах могут негативно сказаться на производительности, поэтому рекомендуется избегать их, насколько это возможно. Я думаю, вы уже используете технику кэширования для изображений. Вы ознакомились с примером 50 штатов?   -  person José Pereda    schedule 28.06.2016
comment
@JoséPeda Да, я видел это некоторое время назад. Я собирался попробовать функцию charmlistview, вызывающую задержку прокрутки, но случайно обнаружил, что проблема возникает из-за эффекта тени. Считаете ли вы, что замена списка на очарование может решить проблему с эффектом тени. Потому что, насколько я понимаю, проблема заключается не в самом списке, а в влиянии на внешнюю панель.   -  person javasuns    schedule 28.06.2016
comment
Как я уже сказал, эффекты плохо влияют на производительность, независимо от того, какой элемент управления вы используете, но есть несколько экспериментальных опций, которые лучше работают с CharmListView. Опять же, рассмотрите другие альтернативы эффектам (может быть, внешнее изменение изображений?)   -  person José Pereda    schedule 28.06.2016
comment
@JoséPeda Ну да, я использовал это, применив тень к самому изображению флага. Но в вышеупомянутом случае мы говорим о тени на панели, а не об изображении. Честно говоря, я удивлен, почему он не прокручивается плавно, поскольку внешняя панель остается статической, а изменяется только содержимое в представлении списка.   -  person javasuns    schedule 28.06.2016
comment
Я не проверял, но всякий раз, когда вы прокручиваете, возможно, панель становится недействительной (поскольку ее содержимое изменилось) и отображается снова и снова. Можете ли вы попробовать добавить еще один промежуточный контейнер для listView, на этот раз без эффектов?   -  person José Pereda    schedule 28.06.2016
comment
@JoséPeda В настоящее время у меня есть GridPane, который содержит метку, список и кнопку. Вы имеете в виду перенести список на другую панель и применить эффект к Gridpane?   -  person javasuns    schedule 28.06.2016
comment
Да, я не пробовал, но идея состоит в том, чтобы изолировать прокрутку от корневой панели, чтобы она не стала недействительной.   -  person José Pereda    schedule 28.06.2016
comment
@JoséPeda Я обернул ListView в AnchorPane, но это не повлияло на прокрутку. Кажется, что родитель зависит от своих детей   -  person javasuns    schedule 28.06.2016
comment
Можете ли вы использовать StackPane в качестве корня для панели (с эффектом) и GridPane (без эффекта)?   -  person José Pereda    schedule 28.06.2016
comment
Давайте продолжим обсуждение в чате.   -  person javasuns    schedule 28.06.2016


Ответы (1)


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

Эффекты

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

Старайтесь не применять их к узлам, которые сильно меняются, например к ячейкам элементов управления ListView, TableView или ComboBox.

Кроме того, если вы примените их к родителю с указанными дочерними элементами (ListView,...), родитель (и эффект) будут отображаться все время, если дочерние элементы станут недействительными (после прокрутки или подобного).

Если вам действительно нужен эффект над этим родителем, попробуйте разделить родительский и дочерний элементы.

Вместо:

parent (Pane with effect)
  |-- ListView

вы можете сделать что-то вроде:

parent (StackPane without effect)
  |-- Pane (with effect)
  |-- ListView 

Поскольку панель не сильно изменится, вы можете использовать Cache поверх нее. Как правило, стратегия кэширования работает путем рендеринга изображения узла (панели с эффектом), вместо того, чтобы заново создавать узел и этот эффект заново, так что это быстрый выигрыш:

parent (StackPane without effect)
  |-- Pane (with effect) and with Cache
  |-- ListView 

Напротив, не используйте кеш на узлах, которые сильно меняются (например, ListView).

CSS

Сложный CSS требует много времени процессора. Попробуйте упростить его. Даже вы можете удалить весь CSS для быстрого теста. Затем решите, что вы можете или не можете использовать.

Попробуйте также заменить некоторые стили кодом.

Анимация

То же самое касается анимации: по возможности избегайте анимации и переходов.

Количество узлов и настраиваемых элементов управления

Чем больше количество узлов, тем ниже производительность, поэтому постарайтесь свести ее к минимуму (заменяя сложный контент изображениями, холстом, когда это возможно).

Переключение сцен

Мобильные экраны меньше, и лучше иметь меньше контента в каждой сцене, чем на десктопе. Также важно избегать переключения сцен или сцен. Вместо этого используйте разные узлы и замените их на одну и ту же сцену.

Gluon Charm использует View узлы и простой способ переключения между различными представлениями: MobileApplication.getInstance().switchView("other view name").

Изображения

Наконец, при использовании изображений, загруженных из Интернета или загруженных из файла, стратегии кэширования являются обязательными. Взгляните на те, что предоставлены Gluon Очарование вниз.

person José Pereda    schedule 29.06.2016
comment
Разделение родителей и детей сделало работу. Я последовал вашему предложению добавить еще одну панель и применить к ней эффект тени вместо того, чтобы применять его непосредственно к ListView. Как только я включил кэширование на этом узле, все заработало как часы. Плавная и быстрая прокрутка :) - person javasuns; 04.07.2016