我是否需要担心画布上的最佳绘图?

时间:2011-10-19 04:43:03

标签: c# wpf performance canvas graph

我要在画布上绘制图形(由scrollviewer绑定)。内存中有 200 左右的节点。

为了简单起见,我从一个可以自我渲染的usercontrol派生出节点。

但我没有在节点之间创建线条。我从MSDN了解到,

  

在表面上,Geometry类和Shape类非常相似。两者都用于2D图形的渲染,并且都具有从它们派生的类似的具体类,例如,EllipseGeometry和Ellipse。但是,这两组课程之间存在重要差异。首先,Geometry类缺少Shape类的一些功能,例如绘制自身的能力。

因为可能有更多的节点,系统可能会慢慢渲染。因此,为了提高性能,我觉得最好的选择是几何(自定义渲染)。

我的问题:

  1. 我应该使用Shape或Geometry绘制线条吗?

  2. 我应该只渲染scrollviewer的当前视口区域来加速显示(在这种情况下我必须将节点从控件转换为几何对象),或者我应该只遍历所有节点和它们之间的划线?

  3. 我应该在位图上的内存中渲染图形然后翻转吗?听起来更像是一般应用程序编程的游戏编程! :d

  4. WPF是否会自动处理渲染内容以及哪些内容无法提升效果?

1 个答案:

答案 0 :(得分:2)

要思考的几点......

从你的主题我得到你不希望节点重绘自己的能力,因为这可能会使它们变慢。相反,您想要决定何时以及绘制哪个节点。我对么?

那对我来说没问题,但Canvas永远不会被虚拟化。我建议您浏览codeplex网站并下载WPFToolkit源代码。在DataVisualization命名空间下,您有几个图表控件(甚至ScatterredChart类似于您的节点之间未绘制线条的ScatterredChart)及其源代码。观察他们做了什么。他们如何提高图表工具的性能。

我也遇到了关于如何实现Scrollable Virtualized Canvas的这一文章。可能这可以帮助您在画布上实现节点的快速渲染。

个人......

1]几何图形很轻,我喜欢它们。

2] Visual HitTesting可以帮助您了解项目是否在渲染区域下,即在滚动视图的范围内。否则将其隐藏,以便它不会自己绘制。 “隐藏”而不是“倒塌”,因为滚动的表现会很好。

3]我记得我的同事甚至使用水平方向的虚拟化堆叠面板,以便渲染节点和单位视图,即特定于X轴上一个点的区域,这样这些重复区域就会自动生成合在一起产生一个整体图形。

很棒的是,这是一个很好的事情!

一切顺利,并告诉我们您的进展情况。