2009-09-29 29 views
13

我目前正在开发一个可视化工具,吸引了WPF的形​​状,如路径,椭圆形等,在画布上。我已经实施了一种虚拟化方法,在这种方法中,Shapes根据其可见性正在销毁和创建。但是,即使只有600个椭圆可见,应用程序似乎也很困难。WPF性能:显示数千路径/形状的在Canvas

我的选择是什么来加快速度?我正在考虑将分组的Shapes(假设每次500个)呈现为透明位图,并且只将它们绘制在Canvas上。但我不知道这是否是一个好主意......从我所收集这需要某种形式的黑客攻击,如果应用的转换:关于使用大WritableBitmap

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

什么?这是另一种方法吗?

回答

6

WPF在幕后工作的图纸和几何形状 - 当你说你和形状的工作,是这些实际的UI元素?这些元素比较重。如果您只使用基本(最好是流式)几何图纸绘制图画,则根据我的经验,您将获得最佳性能。

我设法达到约10000点用这种方法一个合理的帧率,但比任何一个点更复杂的启动速度变慢(比方说,圆点甚至只是矩形)。不过,如果您想避免尽可能多的WPF开销,基本的几何图形和基本的图纸是最好的选择。

可写的位图显然是最终速度更快,但是这意味着你自己都撕掉那些形状,或缓存结果的位图,如果它大多是静态的。此外,您通常会在渲染位图之前应用转换,而不是将它们应用于渲染的位图本身。

+0

我目前正在使用这种方法:一个VirtualPath类,存储路径数据并返回一个WPF System.Windows.Shapes.Path一旦其边界可见。 – kitsune 2009-09-29 08:09:00

+0

感谢您指点我StreamGeometry,我还不知道这个类 – kitsune 2009-09-29 08:09:53

+1

@kitsune,你有没有完成你的“虚拟路径,尽快返回路径可见”的伎俩?我想我可以从我的一个项目中受益 – 2012-02-13 17:43:45

-1

蛮力方法可能实现一个ActiveX控件和渲染直接使用Win32图形。但是,这将会有些尴尬。 QT的画布控制可能是一个更温暖蓬松的方法来达到同样的目的,而且它很快就会呈现这种类型的东西。 Troll为商业版本的QT提供了一个ActiveX包装器,因此它可能更易于集成。

+1

这与标记为“WPF”的问题有什么关系? – stakx 2014-12-11 22:07:21

2

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

我研究的话题了一下,我发现最好的是像你说的手动创建DrawingVisuals。它为WPF节省了大量内部工作,因此速度更快。我使用这种技术来创建一个可以有几百个点的轻量级图表。这里是我自己启发的文章,你可能已经知道了。

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

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

好运。