2012-11-11 56 views
0

有畫在WPF等線路比使用優化WPF DrawingContext.DrawLine

DrawingContext.DrawLine(pen, a, b); ? 

Im做了很多線在我的應用程序繪製的更有效的方式,而99%的時間是在花循環進行此調用。

[A,B]來自點的一個非常大的列表,它是不斷變化的。我不需要任何輸入反饋/事件之類的東西,......我只是需要點繪製的速度非常快。

有什麼建議嗎?

回答

2

你可以嘗試凍結筆。這裏是關於freezable objects的概述。

+0

謝謝,我試過了,它確實提供了一個小的提升。 – wforl

0

看來,StreamGeometry是要走的路。即使不凍結,我仍然可以獲得性能提升。

0

這個問題確實是老了,但我發現了一個方式,提高其使用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版