我需要担心画布上的最佳绘制吗?

3

我需要在一个Canvas(由一个ScrollViewer绑定)上绘制图形。内存中有大约200个节点。

为了保持简单,我从UserControl派生了节点,并可以呈现自己。

但是我还没有创建节点之间的连线。根据MSDN所述:

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

因为可能会有许多更多的节点,系统可能会缓慢地渲染事物。因此,为了提高性能,我认为最好的选择是使用Geometry(自定义渲染)。

我的问题:

  1. 我应该使用Shape还是Geometry来绘制线条?

  2. 为了加快显示速度,我应该仅渲染滚动视图区域中的当前视口(在这种情况下,我需要将节点从控件转换为几何对象),还是应该遍历所有节点并在它们之间绘制线条?

  3. 我应该在内存中将图形呈现在位图上,然后翻转它吗?这听起来更像游戏编程而不是一般应用程序编程!:D

  4. WPF是否会自动处理视图中的内容和未渲染的内容以获得更好的性能?

1个回答

2
一些需要考虑的问题...
从您的主题中,我了解到您不希望节点具有重新绘制自身的能力,因为这可能会使它们变慢。相反,您想要决定何时以及哪个节点进行绘制。我理解得对吗?
嗯,我认为这看起来还不错,但是Canvas永远不会虚拟化。我建议浏览CodePlex网站并下载WPFToolkit源代码。在DataVisualization命名空间下,您有几个图表控件(甚至有类似于您的ScatterredChart,其中节点之间没有绘制线条),以及它们的源代码。观察他们所做的事情。他们如何增加其图形工具的性能。
我还发现了这篇文章,介绍了如何实现可滚动虚拟化画布。也许这可以帮助您实现在画布上快速渲染节点。
个人而言...
1] 几何图形很轻巧,我喜欢它们。
[英译中]

2] 视觉命中测试 可以帮助您了解某个项是否在呈现区域内,即在滚动视图的边界内。否则,请将其隐藏,以便它不会绘制自身。之所以选择“隐藏”而不是“折叠”,是因为滚动的启发式算法可以正常工作。

3] 我记得我的同事甚至使用了具有水平方向的虚拟化堆栈面板,以便它呈现节点和单元视图,即特定于X轴上一点的区域,以便这些重复区域会自动适合在一起形成一个整体的图形。

那个实现真是太神奇了!

祝一切顺利,记得随时告知我们您的进展。


谢谢您指出虚拟化。让我试一下,几天后会汇报结果。 - Nayan
我尝试了虚拟画布示例和我的轻量级解决方案的组合。感谢您给出正确的方向! - Nayan
1
没关系。如果您有任何更多的疑问,请随时回复。 - WPF-it

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