我要在画布上绘制图形(由scrollviewer绑定)。内存中有 200 左右的节点。
为了简单起见,我从一个可以自我渲染的usercontrol派生出节点。
但我没有在节点之间创建线条。我从MSDN了解到,
在表面上,Geometry类和Shape类非常相似。两者都用于2D图形的渲染,并且都具有从它们派生的类似的具体类,例如,EllipseGeometry和Ellipse。但是,这两组课程之间存在重要差异。首先,Geometry类缺少Shape类的一些功能,例如绘制自身的能力。
因为可能有更多的节点,系统可能会慢慢渲染。因此,为了提高性能,我觉得最好的选择是几何(自定义渲染)。
我的问题:
我应该使用Shape或Geometry绘制线条吗?
我应该只渲染scrollviewer的当前视口区域来加速显示(在这种情况下我必须将节点从控件转换为几何对象),或者我应该只遍历所有节点和它们之间的划线?
我应该在位图上的内存中渲染图形然后翻转吗?听起来更像是一般应用程序编程的游戏编程! :d
WPF是否会自动处理渲染内容以及哪些内容无法提升效果?
答案 0 :(得分:2)
要思考的几点......
从你的主题我得到你不希望节点重绘自己的能力,因为这可能会使它们变慢。相反,您想要决定何时以及绘制哪个节点。我对么?
那对我来说没问题,但Canvas
永远不会被虚拟化。我建议您浏览codeplex网站并下载WPFToolkit
源代码。在DataVisualization
命名空间下,您有几个图表控件(甚至ScatterredChart类似于您的节点之间未绘制线条的ScatterredChart)及其源代码。观察他们做了什么。他们如何提高图表工具的性能。
我也遇到了关于如何实现Scrollable Virtualized Canvas的这一文章。可能这可以帮助您在画布上实现节点的快速渲染。
个人......
1]几何图形很轻,我喜欢它们。
2] Visual HitTesting可以帮助您了解项目是否在渲染区域下,即在滚动视图的范围内。否则将其隐藏,以便它不会自己绘制。 “隐藏”而不是“倒塌”,因为滚动的表现会很好。
3]我记得我的同事甚至使用水平方向的虚拟化堆叠面板,以便渲染节点和单位视图,即特定于X轴上一个点的区域,这样这些重复区域就会自动生成合在一起产生一个整体图形。
很棒的是,这是一个很好的事情!
一切顺利,并告诉我们您的进展情况。