【问题标题】:Efficiently creating many instances of a winrt metro control有效地创建许多 Winrt Metro 控制实例
【发布时间】:2012-08-15 19:42:38
【问题描述】:

我希望能够在 C# 项目中创建数百个 winrt 控件(搜索结果控件)实例。问题是这样做需要很长时间(十分之一秒或更短),并且必须在 UI 线程上完成,从而造成显示结果的停顿和延迟。

现在我已经通过在启动期间预缓存许多控件实例来绕过这个问题。这种方法有效,但会影响启动时间(分析显示,接近启动的 40% 的处理器时间用于缓存这些控件)并创建要管理的细节,例如缓存的大小。

我认为问题在于,每次实例化控件时,冗余工作(例如重新解析 XAML)都是由底层框架完成的。也许有办法避免重复这项工作?也许我可以廉价地克隆现有控件?有人有想法吗?

【问题讨论】:

  • 你有没有找到办法做到这一点?
  • @joe_coolish 我最终实现了自己的 UI 虚拟化。我在下面添加了一个自我回答。

标签: c# .net performance xaml microsoft-metro


【解决方案1】:
  • 您可以在并行线程中进行预缓存。对多核处理器的启动时间影响较小

  • searchresult.memberwiseclone 将为您提供浅拷贝。可能会更快,不确定

  • 您能否只使用一个搜索结果并在使用前用正确的数据填充它?在这种情况下,不需要创建很多。只需将一个用作可重复使用的容器。

  • 如果在将控件添加到您可以使用的父窗体时花费时间

    • suspendlayout/resumelayout(这是win32)
    • 完成后将父级设置为不可见并恢复为可见
  • 还有其他方法可以更快地完成相同的事情吗? (竞争控制、3d 派对等)

【讨论】:

  • 1) 无法在非 ui 线程中安全地构造控件。但是,我确实在每个之后都让步,以允许其他事情推进。 2) 没有 MemberwiseClone 功能? 3)我需要展示很多。这本质上是大小为 1 的预缓存策略。 4) 在添加到任何内容之前,时间花在控件的构造函数中,所以我不认为布局是问题。
  • 2) 在 .NET 中被列为基础对象上的方法会预料到的
  • 我明白,但 memberwiseclone 的级别太低了,我希望它会被包含在内。
【解决方案2】:

前言:微软现在可能已经修复了 win8 应用程序 UI 虚拟化。我没查过。

当时我最终所做的只是将我自己的 UI 虚拟化组合在一起来解决这个问题。基本上:缓存控件并重新使用它们来显示可查看的数据(使用二叉搜索树来有效地查询可以看到的内容)。我写了一个blog post about it

【讨论】:

  • 感谢您的快速回复!
猜你喜欢
  • 2014-07-11
  • 1970-01-01
  • 2018-01-01
  • 2015-09-05
  • 2012-08-28
  • 1970-01-01
  • 1970-01-01
  • 2011-02-12
  • 1970-01-01
相关资源
最近更新 更多