调整大小时 BitmapCache 性能不佳
BitmapCache poor performance while resizing
我有一个 ListView
,其中包含不同的复杂 ListViewItem
容器,其中包含图像、阴影效果、模糊效果等。大量渲染这些容器会严重降低性能,尤其是因为我在 ListView
上使用模糊叠加框。这就是为什么在这种情况下我将 CacheMode
设置为 BitmapCache
(将性能提高高达 15 倍的 fps)。
<Border.CacheMode>
<BitmapCache />
</Border.CacheMode>
问题是我使用 WrapPanel
和 ValueConverter
动态调整大小并将这些容器放入 WrapPanel
中,以便它们完全填充 space水平或平铺视图。显然,这不适用于缓存,它会产生严重的 lags/stalls(帧下降到 0)。
目前我的 3 个选项是:
- 禁用缓存(几乎可以达到 15fps)
- 禁用调整大小(看起来不可接受)
- 仅在调整大小时禁用缓存和调整大小window(仍然表现不佳,但这是我拥有的最佳选择)
我的问题:
- 为什么我在调整大小时使用缓存与不使用缓存时性能会大幅下降?
- 我是在滥用缓存还是做错了?
- 有没有更好的方法来解决这个问题而不妥协?
好的。经过大量阅读和试验,我想到了两件事:
首先,Caching
不应用于经常调整大小的元素,尤其是当它们太多时(无法找出原因)。所以,我基本上缓存了固定大小的子元素。
这让我想起了 Virtualization
这正是我所缺少但不知道 WPF Lists
支持的内容。
通过更多优化,现在,我可以调整 window 黄油般光滑的大小。
我有一个 ListView
,其中包含不同的复杂 ListViewItem
容器,其中包含图像、阴影效果、模糊效果等。大量渲染这些容器会严重降低性能,尤其是因为我在 ListView
上使用模糊叠加框。这就是为什么在这种情况下我将 CacheMode
设置为 BitmapCache
(将性能提高高达 15 倍的 fps)。
<Border.CacheMode>
<BitmapCache />
</Border.CacheMode>
问题是我使用 WrapPanel
和 ValueConverter
动态调整大小并将这些容器放入 WrapPanel
中,以便它们完全填充 space水平或平铺视图。显然,这不适用于缓存,它会产生严重的 lags/stalls(帧下降到 0)。
目前我的 3 个选项是:
- 禁用缓存(几乎可以达到 15fps)
- 禁用调整大小(看起来不可接受)
- 仅在调整大小时禁用缓存和调整大小window(仍然表现不佳,但这是我拥有的最佳选择)
我的问题:
- 为什么我在调整大小时使用缓存与不使用缓存时性能会大幅下降?
- 我是在滥用缓存还是做错了?
- 有没有更好的方法来解决这个问题而不妥协?
好的。经过大量阅读和试验,我想到了两件事:
首先,
Caching
不应用于经常调整大小的元素,尤其是当它们太多时(无法找出原因)。所以,我基本上缓存了固定大小的子元素。这让我想起了
Virtualization
这正是我所缺少但不知道WPF Lists
支持的内容。
通过更多优化,现在,我可以调整 window 黄油般光滑的大小。