【问题标题】:Rendering Thread still slow after Virtualization虚拟化后渲染线程仍然很慢
【发布时间】:2011-09-12 12:56:24
【问题描述】:

在高层次上,我的应用程序根据类型将大约 5 种不同的 DataTemplate 应用于一组 ListBoxItem。这些项目被布置在画布上特定的 x、y 点。我在我的 ListBox 上实现了虚拟化,它似乎并没有缩短完成渲染线程进程所需的时间。 UI 完全加载并可供用户使用仍然需要大约 8-12 秒。我认为虚拟化将有助于解决这个问题,但环顾四周后,它似乎只有助于处理 滚动 大量数据。我在这个假设中是否正确,其他人是否有任何其他改进渲染线程的提示。这是我遇到的唯一问题,然后我的项目就完成了。感谢 StackOverflow!

【问题讨论】:

  • 你能显示 XAML 吗?
  • 我不允许发布任何代码,对不起。我会看看我是否可以让它足够通用以放在这里。这是一组非常大的代码,我知道这根本没有帮助。
  • 只有从 VS 运行时才会出现问题。如果你直接运行.exe,你还有问题吗?它可能有一些您没有看到的绑定错误。尝试设置presentationtrace = high 并运行一次,看看是否有任何错误。

标签: wpf performance listbox rendering virtualization


【解决方案1】:

虚拟化意味着只创建您可见的项目,然后在您滚动时动态销毁/创建新项目。另一种方法是一次性为所有项目创建所有 UI 控件。

听起来您对应用程序的其余部分有更大的问题。您是否在后台线程上执行所有加载操作? UI 控件树真的很复杂吗?您是在展示 100 件还是 1000 件物品?

【讨论】:

    【解决方案2】:

    我们在 WPF 中的性能方面也遇到了很多问题。最好的方法当然是分析您的应用程序。为此,我们使用 ANTS 性能分析器,但任何 .NET 分析器都可以。由于查找我们的 XAML 资源,我们的性能受到了巨大的影响。这就是我能给你的建议: 尽量减少 XAML 中的所有资源。但不仅如此,还要尽量减少您拥有的 XAML 文件的数量。您可以尝试的一件事是延迟加载 DataTemplate 的复杂部分。与在浏览器中加载 JPEG 时发生的情况类似,首先您会看到一个像素化的图像,在完成加载 JPEG 后会更好。要做到这一点,首先使用更简单的 DataTemplate,然后如果这是可见的,则仅按需或在一段时间后加载复杂的模板。 但如果没有您具体问题的更多信息,我们只能猜测。 This 是我关于类似主题的一个老问题,也许这也会有所帮助。

    【讨论】:

    • 我也有类似的经历。 SP1 似乎有帮助,也重启了
    【解决方案3】:

    是的,ListBox 虚拟化用于滚动。当 ListBox 中有大量项目时,启用虚拟化将只渲染可见项目(+ 一些额外的滚动项目),滚动 ListBox 会替换已渲染项目中的数据,而不是渲染新项目。

    如果您要发布一些代码,也许我们可以帮助您进行一些性能调整

    【讨论】:

    • 我将在会议结束后发布一些通用代码。我遵守发布代码的严格政策,抱歉
    猜你喜欢
    • 1970-01-01
    • 2014-07-25
    • 2019-07-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多