2012-11-11 1 views
0

최적화 WPF DrawingContext.DrawLine

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

임 내 응용 프로그램에서 선 그리기를 많이하고 사용하는 것보다 다른 WPF에서 선을 그릴의보다 효율적인 방법이 있나요, 시간의 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) { 
    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(); 

이전 코드는 3000의 두 곡선을 플롯 ~ 140 밀리 걸릴 것 : 여기

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(); 

이제 코드는 다음과 같습니다

이 한 시간 전에 곡선을 그리는 내 코드이었다 전철기. 새로운 것은 약 5ms가 걸립니다. StreamGeometry를 사용하면 DrawingContext.Drawline보다 훨씬 효율적입니다.

편집 : dotnet 프레임 워크 버전 3.5를 사용 중입니다.