【问题标题】:WPF Performance: Displaying thousands of Paths / Shapes on a CanvasWPF 性能:在画布上显示数千个路径/形状
【发布时间】:2009-09-29 07:49:55
【问题描述】:

我目前正在开发一种可视化工具,可以在 Canvas 上绘制 WPF 形状,例如路径、椭圆等。我已经实现了一种虚拟化方法,其中根据形状的可见性动态销毁和创建形状。然而,即使只有大约 600 个椭圆可见,该应用程序似乎也很困难。

我有哪些加快速度的选择?我正在考虑将分组的形状(假设一次 500 个)渲染为透明位图,并且只在画布上绘制这些形状。但我不知道这是否是个好主意......据我所知,如果应用了转换,这需要某种技巧:

     VisualBrush shapeBrush = new VisualBrush(shape);  

     DrawingVisual drawingVisual = new DrawingVisual();  
     DrawingContext drawingContext = drawingVisual.RenderOpen();  

     using (drawingContext)  
     {  
        drawingContext.DrawRectangle(shapeBrush, null, new Rect(new Point(0, 0), new Point(actualWidth, actualHeight)));  
     }  
     renderTarget.Render(drawingVisual);  

使用大的 WritableBitmap 怎么样?那会是另一种方法吗?

【问题讨论】:

    标签: wpf performance vector-graphics ui-virtualization


    【解决方案1】:

    WPF 在幕后可以处理绘图和几何图形 - 当您说您正在处理形状时,这些是实际的 UIElement 吗?这些元素的重量要重得多。如果您仅使用基本(最好是流式)几何图形来绘制图纸,您将获得根据我的经验获得的最佳性能。

    我设法通过这种方法以合理的帧速率获得了大约 10000 个点,但是任何比点更复杂的东西都会开始减慢速度(例如,圆点甚至只是矩形)。不过,如果您想尽可能多地避免 WPF 开销,那么基本的几何图形和基本绘图仍然是可行的方法。

    Writeable 位图显然最终会更快,但这意味着您自己渲染所有这些形状,或者,如果结果位图大部分是静态的,则缓存结果位图。此外,您通常希望在渲染到位图之前应用转换,而不是将它们应用到渲染的位图本身。

    【讨论】:

    • 我目前正在使用这种方法:一个 VirtualPath 类,它存储 Path 数据并在其边界可见时立即返回 WPF System.Windows.Shapes.Path。
    • 感谢指点我 StreamGeometry,我还不知道这门课
    • @kitsune,你有没有完成过你的“一旦可见就返回路径的虚拟路径”技巧?我认为我可以在我的一个项目中从中受益
    【解决方案2】:

    我知道这是一个老问题,我只是为了社区的利益而回答。

    我对该主题进行了一些研究,发现最好的方法是像您说的那样手动创建绘图视觉对象。它为 WPF 节省了大量内部工作,因此最终速度要快得多。我使用该技术创建了一个可以有几百个点的轻量级图表。这是我启发自己的文章,你可能已经知道了。

    http://blogs.microsoft.co.il/blogs/tamir/archive/2008/03/02/how-to-high-performance-graphics-in-wpf.aspx

    编辑:新网址http://khason.net/blog/how-to-high-performance-graphics-in-wpf/
    编辑:较新的网址:http://dedjo.blogspot.com/2008/03/how-to-high-performance-graphics-in-wpf.html

    祝你好运。

    【讨论】:

      【解决方案3】:

      一种蛮力方法可能是实现 ActiveX 控件并直接使用 Win32 渲染图形。但是,这会有些繁琐。 QT 的画布控件可能是一种更加温暖和蓬松的方法来达到同样的目的,并且它以相当快速地渲染这种类型的东西而著称。 Troll 为 QT 的商业版本提供了一个 ActiveX 包装器,因此它可能更容易集成。

      【讨论】:

      • 这与标记为WPF的问题有什么关系?
      猜你喜欢
      • 2018-02-21
      • 1970-01-01
      • 2014-05-06
      • 1970-01-01
      • 2014-04-29
      • 1970-01-01
      • 2011-02-04
      • 1970-01-01
      相关资源
      最近更新 更多