【问题标题】:Do I need to worry about optimal drawing on canvas?我需要担心画布上的最佳绘图吗?
【发布时间】:2011-10-19 04:43:02
【问题描述】:

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

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

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

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

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

我的问题:

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

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

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

  4. WPF 是否不会自动处理呈现视图中的内容和不呈现更好性能的内容?

【问题讨论】:

    标签: c# wpf performance canvas graph


    【解决方案1】:

    需要思考的几点...

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

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

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

    个人...

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

    2] Visual HitTesting 可以帮助您了解项目是否在渲染区域下,即在滚动视图的范围内。否则将其隐藏,以便它不会自行绘制。 “隐藏”而不是“折叠”,因为启发式滚动可以正常工作。

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

    执行起来真是太棒了!

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

    【讨论】:

    • 感谢您指出虚拟化。让我试一试,几天后报告结果。
    • 我尝试了将虚拟画布示例和我的代码结合起来的轻量级解决方案。感谢您提供正确的方向!
    • 我的荣幸。如果您还有任何疑问,请回复。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多