除了使用
之外,是否有更有效的方法在WPF中绘制线条DrawingContext.DrawLine(pen, a, b); ?
我在我的应用程序中进行了大量的线条绘制,并且99%的时间花在了一个循环中进行此调用。
[a,b]来自一个不断变化的大量积分。我不需要任何输入反馈/事件或类似的东西,......我只需要非常快速地绘制点。
有什么建议吗?
答案 0 :(得分:2)
答案 1 :(得分:1)
这个问题真的很陈旧,但我找到了一种方法,可以改善我使用DrawingContext.DrawLine的代码的执行情况。
这是我一小时前绘制曲线的代码:
DrawingVisual dv = new DrawingVisual();
DrawingContext dc = dv.RenderOpen();
foreach (SerieVM serieVm in _curve.Series) {
Pen seriePen = new Pen(serieVm.Stroke, 1.0);
Point lastDrawnPoint = new Point();
bool firstPoint = true;
foreach (CurveValuePointVM pointVm in serieVm.Points.Cast<CurveValuePointVM>()) {
if (pointVm.XValue < xMin || pointVm.XValue > xMax) continue;
double x = basePoint.X + (pointVm.XValue - xMin) * xSizePerValue;
double y = basePoint.Y - (pointVm.Value - yMin) * ySizePerValue;
Point coord = new Point(x, y);
if (firstPoint) {
firstPoint = false;
} else {
dc.DrawLine(seriePen, lastDrawnPoint, coord);
}
lastDrawnPoint = coord;
}
}
dc.Close();
现在是代码:
DrawingVisual dv = new DrawingVisual();
DrawingContext dc = dv.RenderOpen();
foreach (SerieVM serieVm in _curve.Series) {
StreamGeometry g = new StreamGeometry();
StreamGeometryContext sgc = g.Open();
Pen seriePen = new Pen(serieVm.Stroke, 1.0);
bool firstPoint = true;
foreach (CurveValuePointVM pointVm in serieVm.Points.Cast<CurveValuePointVM>()) {
if (pointVm.XValue < xMin || pointVm.XValue > xMax) continue;
double x = basePoint.X + (pointVm.XValue - xMin) * xSizePerValue;
double y = basePoint.Y - (pointVm.Value - yMin) * ySizePerValue;
Point coord = new Point(x, y);
if (firstPoint) {
firstPoint = false;
sgc.BeginFigure(coord, false, false);
} else {
sgc.LineTo(coord, true, false);
}
}
sgc.Close();
dc.DrawGeometry(null, seriePen, g);
}
dc.Close();
旧代码需要约140毫秒来绘制两条3000点的曲线。新的大约需要5毫秒。使用StreamGeometry似乎比DrawingContext.Drawline更有效。
编辑:我正在使用dotnet framework version 3.5
答案 2 :(得分:0)
似乎StreamGeometry是要走的路。即使没有冻结它,我仍然可以获得性能提升。