我正在创建一个WPF应用程序,它将显示城市规模的水管理系统的2D矢量图形。我从数百页的阀门、泵、处理设施等示意图以及连接它们的管道中获取了数据。将其与个人住宅和商业地产的映射信息相结合,数据集具有大约100,000个节点实例以及互连管道信息。我有一个概念验证应用程序,它为每个管段或节点(节点非常简单;矩形、圆形等)创建一个DrawingVisual,创建一个DrawingContext,为管道或节点的图形表示呈现线段。将DrawingVisuals添加到画布。每个视觉都是可点击测试的(我需要能够点击它们中的任何一个来获得更详细的信息)。问题是,当视觉效果的数量超过几千个时,性能(平移、缩放)就会下降(尽管在此之前非常酷!)。我尝试过使用抗锯齿和位图缓存,但效果不是很好。
这种事情在WPF中是可能的吗?有没有更好的方法?我来自MFC背景,6-8个月前才开始使用WPF,尽管我有相当多的C#经验。从这里的帖子中,我看到Direct3D经常被提及,但它似乎并不真正适合平面、2D、线条绘图,或者我错了?我看过的XNF教程只涉及精灵,这似乎不太合适?我已经阅读了与业务图相关的帖子;在这些情况下,下采样数据似乎是合适的,但我不确定我是否能做到这一点,因为每个节点和互连管道都是相关的。用户需要相当快的缩放和平移到示意图中的任何点。我在想OpenGL可能是一个值得探索的好东西,但我真的很喜欢它的所有功能(点击测试,很棒的几何类,等等)
有什么建议吗?
谢谢!
发布于 2012-03-02 16:11:01
如果您还没有,您应该看看WPF性能工具:http://msdn.microsoft.com/en-us/library/aa969767.aspx。你应该能够了解真正的瓶颈在哪里,每次都会重新渲染什么,还有更多。
我不得不处理一些3D模型的缩放WPF的问题。虽然我不太确定2D等效项,但这个建议可能仍然适用。
WPF有足够的优势,可以非常努力地根据您的用例对其进行优化,而不是考虑其他替代架构。我认为对我来说,理解和解决性能问题比处理其他框架的工作要少。
最后,对我来说最大的诀窍就是整合模型和视觉效果。而不是有许多小模型,每个模型都是可命中测试的,具有自己的颜色等,我将这些模型聚合到代表许多组件的大模型中。然后,我处理大模型的点击测试,以进一步完善选择,并决定哪个小组件实际上应该“点击”。从那里,我没有改变整个聚合模型的颜色,而是覆盖了一个较小的模型来表示选择。我想你已经明白了.
因此,您需要找出绘图中的哪个抽象部分没有很好地缩放-可能是DrawingVisuals的数量,或者您使用的其他UIElement,然后尝试合并这些部分。
https://stackoverflow.com/questions/9529087
复制相似问题