在WPF中构建CAD程序

6

- 在WPF中构建CAD程序:

我想要构建一个CAD程序,每次会有10000个LINE对象。我使用LineGeometry类来绘制线条并将其添加到Canvas中。我已经实现了缩放和平移功能,目前性能表现良好。

- 唯一的主要问题:

线条的Thickness在缩放时会发生变化。我尝试将线条的Thickness属性绑定到一个因子上以保持不变,这种方法可以解决问题,但在缩放时会严重降低性能。清除并用新的Thickness重新绘制线条也不可行,这样做同样会降低性能并且在当前方法下不切实际。

- 现在有什么解决方案?

  • 继续使用当前方法,忽略Thickness的变化
  • 使用GDI+完成整个工作
  • 在WPF中托管GDI
  • 使用WPF Viewport3D(线条厚度是否不变?)

- 其他解决方案?

您会选择哪些其他方法?我对WPF和编程都很新,我渴望学习。

更新:

目前我的做法是:使用Pen和Brushes在Visual Layer上绘制3000条线段。然后在MouseWheel事件中重新绘制所有线段以更新Thickness。此外,在用户缩放之前不向其显示其他的线段,因此每次MouseWheel事件只创建10000条线段中的3000条。


1
你是否也考虑过在Visual Layer中进行绘图? - Clemens
@Clemens 是的,我已经这样做了,并且它稍微改善了一些事情。我将比例的倒数绑定到线条粗细上。而且我在鼠标滚轮事件中重新绘制线条。我尝试了你建议的路径方法,但是性能也不够好。现在使用 Visual Layer,我能够缩放/重新绘制2000-3000条线。您有任何建议吗?我应该使用 Viewport3D 吗?那里的线条粗细会有同样的问题吗? - Vahid
@Clemens 我的最后一招将是只重绘我需要的部分,并清除视图之外的部分。但在我采取这种措施之前,我想检查所有可能的方法。 - Vahid
1
使用DrawingVisual并仅绘制可视部分听起来是一个明智的方法。 - Clemens
2个回答

4

当对象数量超过1000个时,使用Path对象会降低性能。 - Vahid
1
这是另外一个例子... 您可以通过覆盖DefiningGeometry属性来绘制自己的形状http://khason.net/blog/how-to-high-performance-graphics-in-wpf/. 但缩放可能会有点棘手。 - Suresh Kumar Veluswamy
这也不支持缩放 :( - Vahid
你尝试过可缩放画布吗?http://blogs.msdn.com/b/kaelr/archive/2010/08/11/zoomableapplication2-a-million-items.aspx 你可以相对于缩放反转描边厚度。 - Suresh Kumar Veluswamy

2

除了在WPF中托管WinForms元素之外,我还会在缩放功能上实现部分渲染,例如当您缩放时,所有不可见的内容也不应计算!


仍然在WPF中,3000行代表着3000多个对象。WPF在图形方面的速度较慢,特别是当它需要在短时间内重新计算时。到目前为止,这个问题还没有解决方案。 - woutervs
你有什么建议?我应该选择哪一种方法? - Vahid
1
如果有足够的时间,我会尝试每一种方法并进行性能测试。否则,我会选择WPF并在容器内托管GDI。 - woutervs
问题是我甚至不确定使用GDI+绘制10000多条线是否更快。你有相关经验吗? - Vahid
1
这是一篇关于绘图技术的比较文章。简而言之,GDI(+)最慢,因为它不利用硬件加速;DirectX最快,因为它使用硬件加速;WPF是在DirectX之上的一层,以实现(网格、流、输入框等)。由于WPF使对象更复杂且大小更大,所以它比较慢。因此,结论是使用DirectX,但需要一些时间来学习。 - woutervs
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接