Низкая производительность BitmapCache при изменении размера - PullRequest
0 голосов
/ 09 февраля 2019

У меня есть ListView с различными сложными ListViewItem контейнерами, состоящими из изображений, эффектов теней, эффектов размытия и т. Д. Рендеринг этих контейнеров в больших количествах сильно снижает производительность, тем более что я использую рамку наложения размытия наверхняя часть ListView.Вот почему в этом случае я устанавливаю CacheMode на BitmapCache (повышает производительность до 15 раз в секунду).

<Border.CacheMode>
    <BitmapCache />
</Border.CacheMode>

Проблема в том, что я использую WrapPanel и ValueConverter для динамического изменения размера и размещения этих контейнеров в WrapPanel, чтобы они полностью заполняли пространство в горизонтальном или мозаичном виде.По-видимому, это плохо работает с кэшированием и приводит к серьезным задержкам / задержкам (количество кадров уменьшается до 0).

В настоящее время у меня есть 3 варианта:

  • Отключить кэширование (и житьс почти 15fps)
  • Отключить изменение размера (выглядит неприемлемо)
  • Отключить кэширование и изменение размера только при изменении размера окна (по-прежнему работает плохо, но это лучший вариант, который у меня есть)

Мои вопросы:

  • Почему я получаю эти огромные падения производительности при изменении размера с кэшированием по сравнению с кэшированием?
  • Я неправильно использую кэширование или неправильно?
  • Есть ли лучший способ исправить этот беспорядок без компромиссов?

1 Ответ

0 голосов
/ 23 мая 2019

Хорошо.После долгих чтений и экспериментов я понял две вещи:

  • Во-первых, Caching не следует использовать для элементов, которые часто меняют размер, особенно если их слишком много (не можетне знаю почему).Итак, вместо этого я в основном кэшировал дочерние элементы фиксированного размера.

  • И это напомнило мне о Virtualization, который был именно тем, чего я пропустил, но не знал, что поддерживается в WPF Lists.

Теперь, с некоторыми дополнительными оптимизациями, я могу изменить размер окна как по маслу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...