언급 한 패널은 레이아웃 패널이므로 레이아웃 시스템에 대한 간략한 개요는 가장 효율적인 패널의 단순한 목록이 아니라 효율성과 성능에 가장 큰 영향을 미치는 패널을 사용하는 방법을 제안합니다.
LayoutSystem_Overview :
가장 단순한 레이아웃은 요소의 크기, 위치 및 그리기를 유도하는 재귀 시스템입니다. 보다 구체적으로, 레이아웃은 Panel 요소의 Children 컬렉션 멤버를 측정하고 배열하는 프로세스를 설명합니다. 레이아웃은 집중적 인 프로세스입니다. Children 컬렉션이 클수록 계산 횟수가 많아집니다. 컬렉션을 소유 한 Panel 요소에 의해 정의 된 레이아웃 동작을 기반으로 복잡성을 도입 할 수도 있습니다. Canvas와 같은 비교적 간단한 Panel은 Grid와 같은 복잡한 패널보다 성능이 훨씬 뛰어납니다.
자식 UIElement가 위치를 변경할 때마다 레이아웃 시스템에서 새 패스를 트리거 할 가능성이 있습니다. 따라서 불필요한 호출은 응용 프로그램 성능을 저하시킬 수 있으므로 레이아웃 시스템을 호출 할 수있는 이벤트를 이해하는 것이 중요합니다. 다음은 레이아웃 시스템이 호출 될 때 발생하는 프로세스를 설명합니다.
1. 자식 UIElement는 먼저 핵심 속성을 측정하여 레이아웃 프로세스를 시작합니다.
2. FrameworkElement에 정의 된 크기 속성 (예 : 너비, 높이 및 여백)이 평가됩니다.
3. 독 방향 또는 스택 방향과 같은 패널 별 로직이 적용됩니다.
4. 모든 어린이가 측정 된 후에 내용이 배열됩니다.
5. 어린이 컬렉션이 화면에 그려집니다.
6. 컬렉션에 추가 자식이 추가되거나 LayoutTransform이 적용되거나 UpdateLayout 메서드가 호출되면 프로세스가 다시 호출됩니다.
자식 측정 및 배열에 대한 자세한 내용 은 LayoutSystem_Measure_Arrange 를 참조하십시오.
LayoutSystem_Performance :
레이아웃은 재귀 프로세스입니다. Children 컬렉션의 각 자식 요소는 레이아웃 시스템을 호출 할 때마다 처리됩니다. 결과적으로 레이아웃 시스템의 트리거는 필요하지 않을 때 피해야합니다. 다음 고려 사항은 성능을 향상시키는 데 도움이 될 수 있습니다.
레이아웃 시스템에서 어떤 속성 값을 변경하면 재귀 적으로 업데이트되는지 확인하십시오.
값으로 인해 레이아웃 시스템이 초기화 될 수있는 종속성 속성에는 공용 플래그가 표시됩니다. AffectsMeasure 및 AffectsArrange는 속성 값 변경이 레이아웃 시스템에 의해 재귀 적으로 업데이트되도록하는 유용한 단서를 제공합니다. 일반적으로 요소의 경계 상자 크기에 영향을 줄 수있는 속성에는 AffectsMeasure 플래그가 true로 설정되어 있어야합니다. 자세한 내용은 종속성 속성 개요를 참조하십시오.
가능하면 LayoutTransform 대신 RenderTransform을 사용하십시오.
LayoutTransform은 UI (사용자 인터페이스)의 내용에 영향을주는 매우 유용한 방법입니다. 그러나 변환 효과가 다른 요소의 위치에 영향을 미치지 않아도되는 경우 RenderTransform은 레이아웃 시스템을 호출하지 않으므로 RenderTransform을 대신 사용하는 것이 가장 좋습니다. LayoutTransform은 변형을 적용하고 영향을받는 요소의 새 위치를 설명하기 위해 재귀 적 레이아웃 업데이트를 강제합니다.
UpdateLayout에 대한 불필요한 호출을 피하십시오.
UpdateLayout 메서드는 재귀 적 레이아웃 업데이트를 강제 실행하므로 종종 필요하지 않습니다. 전체 업데이트가 필요한지 확실하지 않으면 레이아웃 시스템을 사용하여이 메소드를 호출하십시오.
대규모 Children 컬렉션으로 작업 할 때는 일반 StackPanel 대신 VirtualizingStackPanel을 사용하는 것이 좋습니다.
자식 컬렉션을 가상화함으로써 VirtualizingStackPanel은 현재 부모의 ViewPort 내에있는 메모리에만 개체를 유지합니다. 결과적으로 대부분의 시나리오에서 성능이 크게 향상됩니다.
성능 최적화 : 레이아웃 및 디자인 :이 기사에서는 트리를 효율적으로 빌드하는 방법에 대해 자세히 설명하고 복잡도에 따라 간단한 패널 목록을 제공합니다.
캔버스 (최소 컴플렉스 : 더 효율적이고 더 나은 성능)
그리드
다른 패널
주의해야 할 다른 성능 고려 사항 : WPF UI 렌더링 속도를 향상시키는 방법
- 모든 것을 캐시하십시오. 브러쉬, 색상, 도형, 서식있는 텍스트, 글리프. (예를 들어, RenderTools와 TextCache의 두 클래스가 있습니다. 각 유닛의 렌더링 프로세스는 두 클래스의 공유 인스턴스로 주소 지정됩니다. 따라서 두 차트가 동일한 텍스트를 가진 경우 준비는 한 번만 실행됩니다.)
- 오랫동안 사용할 계획이라면 Freeze Freezable을 사용하십시오. 특히 기하학. 복잡한 동결되지 않은 형상은 HitTest를 매우 느리게 실행합니다.
- 각 프리미티브의 가장 빠른 렌더링 방법을 선택하십시오. 예를 들어 약 6 가지의 텍스트 렌더링 방법이 있지만 가장 빠른 방법은 DrawingContext.DrawGlyphs입니다.
- 컨테이너 재활용을 활성화합니다. 가상화는 많은 성능 향상을 가져 오지만 컨테이너는 폐기되고 다시 만들어집니다. 이것이 기본값입니다. 그러나 VirtualizingStackPanel.VirtualizationMode = "Recycling"을 설정하면 컨테이너를 재활용하여 더 많은 성능을 얻을 수 있습니다.
- 에서 여기 : 응용 프로그램이 지원할 수있는 중첩의 양에 실질적인 제한이 없습니다, 그러나, 실제로 원하는 레이아웃에 필요한 그 패널을 사용하려면 응용 프로그램을 제한하는 것이 가장 좋습니다. 많은 경우 레이아웃 컨테이너로서의 유연성으로 인해 중첩 패널 대신 그리드 요소를 사용할 수 있습니다. 이는 불필요한 요소를 트리 외부에 유지함으로써 응용 프로그램의 성능을 향상시킬 수 있습니다.