使用绘图视觉在WPF中显示2D原理图

时间:2012-03-02 06:36:37

标签: c# wpf 2d zoom vector-graphics

我正在创建一个WPF应用程序,它将显示城市规模水管理系统的2D矢量图形。我已经从数百页的阀门,泵,处理设施等的示意图以及相互连接的管道中捕获了数据。将其与个别住宅和商业地产的映射信息相结合,并且数据集具有大约100,000个节点实例以及互连管道信息。我有一个概念验证应用程序,为每个管段或节点创建一个DrawingVisual(节点非常简单;一个矩形,圆形等),创建一个DrawingContext,渲染管道的线段或节点的图形表示。 DrawingVisuals被添加到画布中。每个视觉都是可测试的(我需要能够点击它们中的任何一个来获得更详细的信息)。问题在于,当视觉效果的数量超过数千时,性能(平移,缩放)会降低(但在此之前真的很酷!)。我试过摆弄抗锯齿& amp;位图缓存,但它没有多大帮助。

这种事情在WPF中是否可行?有更好的方法吗?我来自MFC背景,并且仅在6-8个月前开始使用WPF,尽管我有相当多的C#经验。从这里的阅读帖子中,我看到经常会提到Direct3D,但它确实看起来很适合平面,2D,线条图,或者我错了吗?我见过的XNF教​​程只涉及sprite,这似乎不合适?我已经阅读了与业务图相关的帖子;在这些情况下,下采样数据似乎是合适的,但我不确定我能做到这一点,因为每个节点和互连管道是相关的。用户需要合理快速的缩放和放大平移到原理图中的任何一点。我认为OpenGL可能是一个很好的探索,但我真的很喜欢WPF的所有功能(命中测试,伟大的几何类等)

有什么建议吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

如果您还没有,请查看WPF性能工具:http://msdn.microsoft.com/en-us/library/aa969767.aspx。您应该能够了解真正的瓶颈在哪里,每次都重新渲染的内容以及更多内容。

我不得不处理这个为某些3D模型缩放WPF的问题。虽然我对2D等效术语不太确定,但建议可能仍然适用。

WPF有足够的优势来尝试为您的用例进行优化,而不是考虑一些替代架构。我认为,与处理其他一些框架相比,理解和解决性能问题的工作要少一些。

最后,对我来说,最重要的是整合模型和视觉效果。而不是拥有许多小模型,每个模型都是可以测试的,具有自己的颜色等,我将它们聚合成代表许多组件的大型模型。然后我处理大型模型的命中测试,以进一步细化选择,并决定实际上应该“击中”哪个小组件。从那里,我不是改变整个聚合模型的颜色,而是覆盖一个较小的模型来表示选择。我想你明白了......

所以你需要弄清楚你的绘图中哪个抽象部分不能很好地缩放 - 也许是DrawingVisuals的数量,或者你使用的其他一些UIElement,然后尝试合并它们。