我正在编写一个类似 CAD 的应用程序,当内容缩小时,该应用程序可能需要显示数万行。
目前我使用 C++ 和 Direct2D,它们工作得相当顺利:我可以在大约 16 毫秒内绘制 100000 条线。所以我知道我的(平均)机器可以处理这个问题。
我正在尝试迁移到 WPF,但我发现其性能令人失望。使用下面的代码,重绘需要近一秒钟(例如,当我调整窗口大小时)。
分析显示瓶颈位于 [wpfgfx_v0400.dll] 中的某个位置,但我无法确切地看到哪些函数。
所以我的问题是:我做错了什么?如何提高下面代码的性能?
public partial class MainWindow : Window
{
public MainWindow ()
{
InitializeComponent ();
var gg = new GeometryGroup ();
Random random = new Random ();
for (int i = 0; i < 1000; i++)
{
Point p0 = new Point (random.Next (1000), random.Next (1000));
Point p1 = new Point (random.Next (1000), random.Next (1000));
var lineGeometry = new LineGeometry (p0, p1);
gg.Children.Add (lineGeometry);
}
var stroke = new SolidColorBrush (Colors.Red);
gg.Freeze ();
stroke.Freeze ();
this.Content = new Path () { Data = gg, Stroke = stroke };
}
}
最佳答案
在 WPF 中绘制内容比您预期的要慢!一般来说,具有 1000 个点的线应该不是问题,但我不希望使用 WPF 几何基元绘制接近 100000 个点的任何位置 - 相反,您最终将不得不自行光栅化或使用一些原始的嵌入的 DirectX在您的 WPF 应用程序中。
具体来说,单行 1000 点的情况应该完全在合理范围内,一些想法:
对于随机数据,如果线路来回覆盖很多区域,这可能会导致一些非常难看的性能。这不仅仅是创建一个大区域来重绘的情况 - 来回似乎会导致 WPF 几何体出现一些糟糕的情况
如果您要绘制一条线,请尝试使用
PolyLine
或PolyLineSegment
在你的Path
如果您确实想要一些断开的线路,而不是
GeometryGroup
充满LineGeometry
,使用Path
有很多PathFigure
对于其他答案指出的一般情况,您可以查看 OnRender
或DrawingVisual
类型方法,取决于您正在做什么,性能可能会更好,也可能不会更好。我认为您仍然会为您建议的元素数量而苦苦挣扎,除非您可以进行某种虚拟化。
关于c# - 在 WPF 中绘制基元非常慢。如何提高?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20073612/