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

kit*_*une 16 wpf performance ui-virtualization vector-graphics

我目前正在开发一种可视化工具,可以在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);  
Run Code Online (Sandbox Code Playgroud)

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

Eam*_*nne 7

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

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

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

  • @kitsune,你有没有完成你的"虚拟路径,尽快返回路径"技巧?我想我可以在我的一个项目中受益 (2认同)