대시 패턴이있는 펜을 사용하는 이유는 WPF Custom 2D Drawing에서 엄청난 (!) 성능 배정을 유발합니까?

StackOverflow https://stackoverflow.com/questions/537950

  •  22-08-2019
  •  | 
  •  

문제

누구든지 대시 패턴으로 펜을 사용할 수 있도록이 문제를 밝힐 수 있기를 바랍니다.

스크롤 가능한 차트를 작성하고 있습니다 (a Panel 내부에 ScrollViewer 그것을 구현합니다 IScrollInfo) WPF에서 DrawingVisual'에스 DataContext.Draw엑스. 나는 수천 가지가있다 DrawingVisual사용하여 스크롤되는 S TranslateTransformPanel 그것은 그들을 호스팅합니다. 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에 익숙하지 않으면 까다로울 것입니다.

아마도 이것은이 특정 드로우 작업이 비디오 카드에 위임 할 수있는 것이 아니기 때문에 메모리의 구성과 비디오 카드에 블리팅을 강제 할 수있는 것이 아니기 때문입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top