有畫在WPF等線路比使用優化WPF DrawingContext.DrawLine
DrawingContext.DrawLine(pen, a, b); ?
Im做了很多線在我的應用程序繪製的更有效的方式,而99%的時間是在花循環進行此調用。
[A,B]來自點的一個非常大的列表,它是不斷變化的。我不需要任何輸入反饋/事件之類的東西,......我只是需要點繪製的速度非常快。
有什麼建議嗎?
有畫在WPF等線路比使用優化WPF DrawingContext.DrawLine
DrawingContext.DrawLine(pen, a, b); ?
Im做了很多線在我的應用程序繪製的更有效的方式,而99%的時間是在花循環進行此調用。
[A,B]來自點的一個非常大的列表,它是不斷變化的。我不需要任何輸入反饋/事件之類的東西,......我只是需要點繪製的速度非常快。
有什麼建議嗎?
你可以嘗試凍結筆。這裏是關於freezable objects的概述。
看來,StreamGeometry是要走的路。即使不凍結,我仍然可以獲得性能提升。
這個問題確實是老了,但我發現了一個方式,提高其使用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框架3.5版
謝謝,我試過了,它確實提供了一個小的提升。 – wforl