我目前正在开发一种可视化工具,可以在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);
使用大的WritableBitmap怎么样?这会是另一种方法吗?
答案 0 :(得分:6)
封面下的WPF与图纸和几何图形一起工作 - 当你说你正在使用形状时,这些实际的UIElements是什么?这些元素的重量相当大。如果您只使用基本(最好是流)几何图形来绘制图纸,那么您将获得最佳体验。
我设法用这种方法以合理的帧速率获得大约10000个点,但是比点更复杂的东西开始减慢速度(比如圆点甚至只是矩形)。如果你想避免尽可能多的WPF开销,基本的几何图形和基本图形是可行的。
可写位图显然最终更快,但这意味着自己渲染所有这些形状,或者,如果它主要是静态的,则缓存结果位图。此外,您通常希望在渲染到位图之前应用变换,而不是将它们应用于渲染的位图本身。
答案 1 :(得分:4)
我知道这是一个老问题,我只是为了社区的利益而回答。
我对这个主题进行了一些研究,我发现最好的是像你说的那样手动创建DrawingVisuals。它为WPF节省了大量内部工作,因此最终速度更快。我使用这种技术创建了一个可以有几百个点的轻量级图表。这是我从中汲取灵感的文章,你可能已经知道了。
编辑:新网址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
答案 2 :(得分:0)
蛮力方法可能是实现ActiveX控件并使用Win32直接渲染图形。然而,这将有点繁琐。 QT的画布控件可能是一种更加温暖和蓬松的方法,并且它以相当快的速度呈现这种类型的东西而闻名。 Troll为商业版的QT提供了一个ActiveX包装器,因此可能更容易集成。