【问题标题】:Drag performance in large canvas with many objects具有许多对象的大型画布中的拖动性能
【发布时间】:2012-02-13 17:41:38
【问题描述】:

我有一个大画布,上面有很多对象,可以滚动(因此它这么大)。 我在屏幕上放置了可以单击和拖动的对象(例如,文本框)。该对象只是捕获鼠标,并在调用 OnMouseMoved 事件时调用 Canvas.SetLeft() 和 SetTop()。

这适用于较小的画布,但这个具有几千个对象的非常大的画布刷新拖动的对象非常缓慢......通常在拖动时刷新超过一秒。不是很用户友好。

我需要改进这个购买不知道如何进行。

我的一个想法是,在前景中保留一个透明画布,它只有当前窗口大小并且不包含子级。开始拖动时,将其移动到该图层直到完成,然后将其移回大图层。为另一个 hack 付出了很多努力......

更新:使用穿孔器,我看到画布在拖动此对象时重复执行布局传递,这是缓慢的部分。想知道有什么办法可以避免这种情况...

【问题讨论】:

  • 某种虚拟化会有所帮助,例如blogs.msdn.com/b/kaelr/archive/2010/08/11/… 可能并不直接适用于可移动物品。
  • @H.B.:只要移动的项目总是被绘制(不管虚拟化),它应该可以正常应用。缓慢刷新可能是画布反复布局其子级的所有,而不仅仅是那些可见的。如果只做后者,应该会有很大的性能提升。
  • 我当然希望画布有一个内置的(可选的?)虚拟器来处理这种东西......我过去在尝试使用虚拟化画布时遇到了问题,但可能是时候了再试一次。啊。
  • 虚拟化并不是那种轻到足以使其成为可选的东西——这就是为什么VirtualizingStackPanel 是一个完全属于它自己的类。
  • 使用装饰层作为你的临时层可能是要走的路...

标签: c# wpf performance xaml


【解决方案1】:

性能优化不是“黑客”。大优化通常涉及拆分事物以便管理性能——这需要付出努力。

您的建议听起来很合理,但是当您“放下”您的项目并且画布刷新时,您得到的延迟可能仍然会发生。另一种方法可能是创建一个“虚拟化”画布,它只绘制当前屏幕上的内容。这是一项足够复杂的任务,我不会尝试在此处提供示例 - 但它可能会有益于整个应用程序的绘制性能。

【讨论】:

  • 我正在走虚拟化路线,但遇到了一些障碍,所以我专注于在大部分画布上使用非常轻量级的项目。加载性能很好,滚动速度很快。所以现在只是这些拖动的项目似乎严重滞后。啊。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-11
  • 1970-01-01
  • 2016-04-18
  • 1970-01-01
  • 2017-04-14
  • 1970-01-01
相关资源
最近更新 更多