我正在编写类似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 };
}
}
答案 0 :(得分:1)
在WPF中绘制内容比您预期的要慢!一般来说,1000点的线不应该是一个问题,但我不希望使用WPF几何图元绘制任何接近100000点的位置 - 相反,您最终必须下拉到光栅化自己或使用一些原始的DirectX嵌入在您的WPF应用程序中。
具体而言,单线1000点的情况应该在理性的范围内,有些想法:
对于随机数据,如果线来回覆盖很多区域,这可能会导致一些非常难看的性能。这不仅仅是创建一个大面积重绘的情况 - 来回往往会导致WPF几何形状出现一些不好的情况
如果您要绘制一行,请尝试在PolyLine
PolyLineSegment
或Path
如果您确实需要多个断开的行,而不是GeometryGroup
满的LineGeometry
,请使用Path
多个PathFigure
。< / p>
对于其他答案所指出的一般情况,您可以查看OnRender
或DrawingVisual
类型的方法,具体取决于您的表现可能会有所改善,也可能不会更好。我认为除非你可以进行某种虚拟化,否则你仍然会对你建议的元素数量感到困惑。