c# - 我需要担心 Canvas 上的最佳绘图吗?

标签 c# wpf performance canvas graph

我必须在 Canvas 上绘制图形(由滚动查看器绑定(bind))。并且内存中有大约 200 左右的节点。

为了简单起见,我从可以呈现自身的用户控件派生了节点。

但我还没有在节点之间创建线。我从MSDN知道那个,

On the surface, the Geometry class and the Shape class are quite similar. Both are used in the rendering of 2D graphics and both have similar concrete classes which derive from them, for example, EllipseGeometry and Ellipse. However, there are important differences between these two sets of classes. For one, the Geometry class lacks some of the functionality of the Shape class, such as the ability to draw itself.

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

我的问题:

  1. 我应该用 Shape 还是 Geometry 来画线?

  2. 我应该只渲染滚动查看器的当前视口(viewport)区域以加快显示速度(在这种情况下我必须将节点从控件转换为几何对象),还是应该迭代所有节点并在它们之间画线?

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

  4. WPF 不会自动负责呈现 View 中的内容和不呈现的内容以获得更好的性能吗?

最佳答案

几点思考...

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

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

我还看到了这篇关于如何实现 Scrollable Virtualized Canvas 的文章.可能这可以帮助您在 Canvas 上实现节点的快速渲染。

个人...

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

2] Visual HitTesting可以帮助您了解某个项目是否在渲染区域下,即在 ScrollView 的边界内。否则将其隐藏,这样它就不会自行绘制。 “隐藏”而不是“折叠”,因为滚动的启发式效果很好。

3] 我记得我的同事甚至使用水平方向的虚拟化堆栈面板,以便它呈现节点和单元 View ,即特定于 X 轴上一个点的区域,以便此类重复区域会自动结合在一起以产生整体图。

很棒的实现!

祝一切顺利,让我们了解您在这方面的进展。

关于c# - 我需要担心 Canvas 上的最佳绘图吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7816617/

相关文章:

c# - 树形 View 和回发

WPF DataGrid v 快,分组 v 慢。如何在不使用分组的情况下显示组行

Linux 文件和进程级 I/O 性能指标

c# - MVC Ajax.error 渲染部分 View

c# - 如何在 .NET 4.6 上使用 .NET Core 的 IdentityServer4?

c# - WPF 中 Silverlight 的 FindElementsInHostCoordinates 是什么?

Wpf - 相对图像源路径

performance - 我的代码中是否有开销使我的线程运行速度变慢[C++]

php - 清算资源

c# - Pivot SelectedItem 属性导致 Windows UWP 崩溃