WPF性能:在画布上显示数千个路径/形状

问题描述 投票:15回答:3

我目前正在开发一种可视化工具,可以在Canvas上绘制路径,椭圆等WPF形状。我已经实现了一种虚拟化方法,其中Shapes被动态销毁和创建,具体取决于它们的可见性。然而,即使只有600个椭圆可见,该应用程序似乎很难。

我有什么选择加快速度?我正在考虑将分组的Shapes(一次说500个)渲染为透明位图,并且只在Canvas上绘制这些。但我不知道这是不是一个好主意......从我收集的内容来看,如果应用了转换,这需要某种黑客攻击:

     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);  

那么使用一个大的WriteableBitmap呢?这会是另一种方法吗?

wpf performance vector-graphics ui-virtualization
3个回答
6
投票

封面下的WPF使用图纸和几何图形 - 当你说你正在使用形状时,这些实际的UIElements是什么?这些元素的重量相当大。如果您只使用基本(最好是流)几何来绘制图纸,您将获得我的经验中的最佳性能。

我设法用这种方法以合理的帧速率获得大约10000个点,但是比点更复杂的东西开始减慢速度(比如圆点或甚至是矩形)。如果您想尽可能避免WPF开销,仍然可以使用基本几何图形和基本图形。

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


4
投票

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

我对这个主题进行了一些研究,我发现最好的是像你说的那样手动创建DrawingVisuals。它为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

祝好运。


0
投票

蛮力方法可能是实现ActiveX控件并使用Win32直接渲染图形。然而,这将有点繁琐。 QT的画布控件可能是一种更加温暖和蓬松的方法,并且它以相当快的速度呈现这种类型的东西而闻名。 Troll为QT的商业版本提供了一个ActiveX包装器,因此可能更容易集成。

© www.soinside.com 2019 - 2024. All rights reserved.