16

我目前正在开发一种可视化工具,可以在 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 怎么样?那会是另一种方法吗?

4

3 回答 3

7

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

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

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

于 2009-09-29T08:00:12.440 回答
4

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

我对该主题进行了一些研究,发现最好的方法是像您说的那样手动创建绘图视觉对象。它为 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 -wpf.html 中的高性能图形

祝你好运。

于 2011-02-07T02:17:07.357 回答
-2

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

于 2009-09-29T08:11:43.153 回答