대시 패턴이있는 펜을 사용하는 이유는 WPF Custom 2D Drawing에서 엄청난 (!) 성능 배정을 유발합니까?
문제
누구든지 대시 패턴으로 펜을 사용할 수 있도록이 문제를 밝힐 수 있기를 바랍니다.
스크롤 가능한 차트를 작성하고 있습니다 (a Panel
내부에 ScrollViewer
그것을 구현합니다 IScrollInfo
) WPF에서 DrawingVisual
'에스 DataContext.Draw
엑스. 나는 수천 가지가있다 DrawingVisual
사용하여 스크롤되는 S TranslateTransform
에 Panel
그것은 그들을 호스팅합니다. a를 배치하여 그리드를 구현했습니다 Panel
그 위에는 한쪽 가장자리에서 다른 가장자리에서 다른 가장자리로 간단한 수평선을 그리며 DataContext.DrawLine(pen, new Point(0, y), new Point(widthOfPanel, y));
// (참고 :이 선은 항상 정적이며 결코 움직이지 않습니다).
스크롤 성능은 절대적으로 미쳤습니다 (예 : DrawingVisual은 즉시 그려지고 스크롤이 즉각적입니다). 그러나 내가 사용한다면 a Pen
이로 인해 대시 패턴 (예 : 아래 참조)을 사용하여 그리드 라인을 그리는 다음 스크롤이 매우 육포이며 성능은 100 배 (추정)만큼 감소한 것 같습니다. 누구든지 왜 그런 일이 일어나고 어떻게 해결 될 수 있습니까?
대시 패턴이있는 펜의 예 :
<Pen x:Key="PenUsingDashPatterns" Brush="Black" Thickness="1">
<Pen.DashStyle >
<DashStyle Dashes="3, 3" />
</Pen.DashStyle>
</Pen>
해결책
펜이 얼어 붙는가? 얼어 붙은 드로잉 물체는 성능을 많이 돕습니다.
로드 된 핸들러를 설정하고 디버그를 설정하여 펜이 얼 었는지 확인할 수 있습니다. 그렇지 않은 경우 Pen.freeze () 버튼을 수동으로 호출하십시오.
Freeze는 또한 펜을 읽기 전용으로 만듭니다. 동결 한 후에는 펜을 수정할 수 없습니다.
다른 팁
가능한 해결 방법은 다음과 같습니다. 수평 및/또는 수직 라인 만 그리는 경우 Pen
체커 패턴으로 DrawingBrush
와 같은:
<Pen x:Key="PenUsingDashPatterns" Thickness="1">
<Pen.Brush>
<DrawingBrush TileMode="Tile"
Viewport="0 0 6 6" ViewportUnits="Absolute">
<DrawingBrush.Drawing>
<GeometryDrawing Brush="Black">
<GeometryDrawing.Geometry>
<GeometryGroup>
<RectangleGeometry Rect="0 0 3 3"/>
<RectangleGeometry Rect="3 3 3 3"/>
</GeometryGroup>
</GeometryDrawing.Geometry>
</GeometryDrawing>
</DrawingBrush.Drawing>
</DrawingBrush>
</Pen.Brush>
</Pen>
또는 표면 및 수평선에 다른 브러시를 사용할 수 있습니다. ImageBrush
더 나은 성능을 위해.
Perforator를 사용하여 성능 문제에 대해 더 깊이 파고 들어야합니다. 다음은 다양한 것에 대해 이야기하는 MSDN 사이트에 대한 링크입니다. WPF 성능 도구. Perforator는 아마도 소프트웨어 렌더러를 사용하여 라인이 그려지는지 여부를 결정하는 데 가장 도움이되는 도구 일 것입니다 (이는 성능이 좋지 않은 성능을 제공하는 가장 큰 요소).
문제가 소프트웨어로 그려진다면 자신의 것을 써야 할 수도 있습니다. ShadeReffect, 그러나 HLSL에 익숙하지 않으면 까다로울 것입니다.
아마도 이것은이 특정 드로우 작업이 비디오 카드에 위임 할 수있는 것이 아니기 때문에 메모리의 구성과 비디오 카드에 블리팅을 강제 할 수있는 것이 아니기 때문입니다.