렌더링 시간과 성능 측면에서 패널이 가장 효율적인 순서는 무엇입니까?
원하는 레이아웃에 여러 패널이 적합한 경우가 많지만 패널 유형에 따라 렌더링 시간이 다르다는 것을 알고 있습니다.
예를 들어 MSDN은 다음과 같이 기술하고 있습니다.
심플한 ★★★★★★★★★★★★★★▼
Panel
「」, 「」등입니다.Canvas
는 보다 ,, 보, 보, 보, 보, 보, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, can, , ,, ,, ,, ,,Panel
「」, 「」등입니다.Grid
.
그렇다면 렌더링 시간과 성능 측면에서 WPF 패널이 가장 효율적인 순서는 무엇일까요?
WPF 패널:
Canvas
DockPanel
Grid
UniformGrid
StackPanel
WrapPanel
VirtualizingPanel
VirtualizingStackPanel
온라인 어딘가에서 이 목록을 본 것 같은데, 지금은 찾을 수가 없어요.
제가 찾는 이상적인 답변은 패널 목록을 가장 빨리 렌더링할 수 있는 순서대로 제공합니다.는 자녀 큰이라는 것을 있기 에 이 각 에는 '아이의 수'만. 따라서 이 질문을 위해 각 패널에는 다음과 같은 요소만 있다고 가정해 보십시오.Label
/TextBox
짝짓기.
또한 특정 조건에 따라 다른 패널보다 성능이 뛰어난 패널 등의 예외 목록을 원합니다.
갱신하다
아래 승인된 답변을 바탕으로 요약하면 패널 성능은 하위 항목의 수와 레이아웃에 기반하지만 일반적으로 가장 빠른 항목에서 가장 느린 항목 순으로 나열됩니다.
Canvas
StackPanel
WrapPanel
DockPanel
Grid
「」,VirtualizingPanel
VirtualizingStackPanel
항상 화면에 표시되지 않는 항목이 많을 때는 항상 사용해야 합니다.
이 목록에서 항목을 선택하기 전에 아래의 승인된 답변을 읽어보시는 것이 좋습니다.
저는 절대적인 상대적인 성능 비교를 시도하는 것보다 각 패널의 성능 특성을 설명하는 것이 더 간결하고 이해할 수 있다고 생각합니다.
WPF는 콘텐츠를 렌더링할 때 다음 두 가지 패스를 수행합니다.측정 및 배열.각 패널은 이들 2개의 패스 각각에 대해 퍼포먼스 특성이 다릅니다.
은 얼라인먼트를 사용하여에 의해 큰 을 받습니다( 의 ).Grid
다음으로 스트레칭 또는 자동 사이징된 아이의 수를 나타냅니다.배열 패스의 성능은 서로 다른 자녀의 배치 위치와 그 후 자녀 수 사이의 상호작용의 복잡성에 의해 영향을 받습니다.
지정된 패널이 필요한 레이아웃에 쉽게 적합하지 않을 수 있습니다.각 항목이 사용 가능한 공간의 특정 비율에 위치하도록 임의의 개수의 항목이 필요한 컨트롤을 만들었습니다.기본 컨트롤은 이 기능을 하지 않습니다.(부모의 실제 크기에 대한 바인딩을 통해) 이 작업을 수행하려고 하면 성능이 저하됩니다.최소한의 작업으로 원하는 결과를 얻을 수 있는 캔버스를 기반으로 레이아웃 패널을 만들었습니다(캔버스 소스를 복사하여 20줄 정도 수정).
사용 가능한 패널:
캔버스
캔버스 영역을 기준으로 좌표를 기준으로 하위 요소를 명시적으로 배치할 수 있는 영역을 정의합니다.
캔버스는 각 항목에 정적으로 위치가 할당되므로 배열 경로에 대한 모든 패널 중 최고의 성능을 발휘합니다.또한 이 패널에는 스트레칭 개념이 없기 때문에 측정 패스는 뛰어난 성능을 발휘합니다. 각 어린이가 기본 크기를 사용합니다.
독패널
서로 상대적인 수평 또는 수직으로 하위 요소를 배열할 수 있는 영역을 정의합니다.
Dockpanel(도크 패널)은 매우 심플한 레이아웃 방식으로, 이전에 추가한 항목과 비교하여 항목을 하나씩 추가할 수 있습니다. 사이즈 왼쪽에되며, 은 '/아래/오른쪽'에 의해 결정됩니다.
Dock
속성(폭 또는 높이가 정의되지 않은 경우)을 클릭합니다.중간에서 빠른 측정 패스 및 중간에서 빠른 배열 패스.격자무늬
열과 행으로 구성된 유연한 그리드 영역을 정의합니다.
비례적인 크기 조정 또는 자동 크기 조정을 사용하는 경우 이 패널이 가장 성능 집약적인 패널이 될 수 있습니다.하위 항목 크기를 계산하는 것은 항목의 기본 크기와 그리드에서 지정된 레이아웃의 복잡한 조합일 수 있습니다.레이아웃도 모든 패널 중 가장 복잡합니다.측정 패스의 경우 느린 성능에서 중간 성능으로, 배열 패스의 경우 느린 성능에서 중간 성능으로.
스택 패널
하위 요소를 수평 또는 수직 방향으로 지정할 수 있는 단일 선으로 정렬합니다.
스택 패널은 방향과 반대 방향의 네이티브 또는 상대 크기 조정 및 방향의 네이티브 크기 조정을 사용하여 하위 크기를 측정합니다(정렬은 이 방향에서는 아무 것도 하지 않음).이 때문에, 이 분야에서는 중간 레벨의 퍼포먼스가 됩니다.어레인지먼트 패스는 단순히 아이템을 순서대로 배치하는 것입니다.아마 이 패스를 위한 두 번째 퍼포먼스일 겁니다.측정 패스에 대한 중간 성능, 레이아웃 패스에 대한 빠른 성능.
가상화 패널
하위 데이터 수집을 가상화하는 패널 요소의 프레임워크를 제공합니다.이것은 추상적인 수업입니다.
자체 가상화 패널을 구현하기 위한 기본 클래스입니다. of of of of much of of 아이템 세트에 대한 퍼포먼스가 대폭 향상되었습니다.경계 검사로 인해 화면에 표시되는 항목의 성능이 약간 저하될 수 있습니다.를 1개밖에 의 서브클래스입니다.
VirtualizingStackPanel
.랩 패널
하위 요소를 왼쪽에서 오른쪽으로 순차적인 위치에 배치하여 내용을 포함 상자의 가장자리에서 다음 줄로 바꿉니다.이후 순서는 방향 특성 값에 따라 위에서 아래로 또는 오른쪽에서 왼쪽으로 순차적으로 수행됩니다.
측정 패스는 특정 행의 가장 큰 항목이 행의 높이를 결정한 다음 해당 행의 각 항목이 기본 높이(있는 경우) 또는 행의 높이를 사용하는 다소 복잡한 패스입니다.레이아웃 패스는 심플합니다.각 항목을 1열씩 나열한 후 다음 항목을 위한 공간이 부족할 때 다음 행으로 이어집니다.중간 정도의 퍼포먼스 측정 패스.어레인지 패스에 적합한 중급에서 고속의 퍼포먼스.
참고 자료:
가능한 한 가장 효율적인 패널 사용
레이아웃 프로세스의 복잡성은 사용하는 패널 파생 요소의 레이아웃 동작을 직접 기반으로 합니다.예를 들어 그리드 또는 스택 패널 컨트롤은 캔버스 컨트롤보다 훨씬 많은 기능을 제공합니다.이러한 기능 향상에 따른 대가는 퍼포먼스 비용 증가입니다.그러나 그리드 컨트롤이 제공하는 기능이 필요하지 않은 경우 캔버스나 사용자 지정 패널과 같이 비용이 적게 드는 대체 옵션을 사용해야 합니다.
레이아웃 시스템은 Children 컬렉션의 각 멤버에 대해 측정 패스와 배열 패스를 2회 완료합니다.각 하위 패널은 고유한 레이아웃 동작을 달성하기 위해 고유한 MeasureOverride 및 ArrayOverride 메서드를 제공합니다.
측정 통과 중에 Children 컬렉션의 각 구성원이 평가됩니다.프로세스는 Measure 메서드에 대한 호출로 시작됩니다.이 메서드는 부모 패널 요소의 구현 내에서 호출되며 레이아웃을 수행하기 위해 명시적으로 호출할 필요는 없습니다.
먼저, UIElement의 Clip 및 Visibility와 같은 네이티브 크기 속성을 평가합니다.그러면 ConstraintSize라는 이름의 값이 생성되어 MeasureCore로 전달됩니다.
다음으로 FrameworkElement에서 정의된 프레임워크 속성이 처리되어 contraintSize 값에 영향을 줍니다.이러한 속성은 일반적으로 높이, 폭, 여백 및 스타일과 같은 기본 UIElement의 크기 조정 특성을 나타냅니다.이러한 각 속성은 요소를 표시하는 데 필요한 공간을 변경할 수 있습니다.그런 다음 ConstraintSize를 매개 변수로 사용하여 MeasureOverride가 호출됩니다.
주의: 높이와 폭, 실제 높이와 실제 폭 속성에는 차이가 있습니다.예를 들어, ActualHeight 속성은 다른 높이 입력 및 레이아웃 시스템을 기반으로 계산된 값입니다.이 값은 실제 렌더링 패스에 따라 레이아웃 시스템 자체에 의해 설정되므로 입력 변경의 기초가 되는 높이와 같은 속성 설정 값보다 약간 늦어질 수 있습니다.Actual Height는 계산된 값이기 때문에 레이아웃 시스템에 의한 다양한 조작으로 인해 변경 내용이 여러 개 또는 증분 보고될 수 있습니다.레이아웃 시스템은 하위 요소에 필요한 측정 공간, 상위 요소에 의한 구속조건 등을 계산할 수 있습니다.Measure Pass의 최종 목표는 자녀가 MeasureCore 호출 중에 발생하는 원하는 크기를 결정하는 것입니다.DesiredSize 값은 콘텐츠 배열 경로 중에 사용할 수 있도록 Measure에 저장됩니다.
arrange 패스는 arrange 메서드에 대한 호출로 시작됩니다.배열 경로 중에 부모 패널 요소는 하위의 경계를 나타내는 직사각형을 생성합니다.이 값은 처리를 위해 ArrayCore 메서드에 전달됩니다.
ArrayCore 메서드는 하위의 원하는 크기를 평가하고 요소의 렌더링 크기에 영향을 줄 수 있는 추가 마진을 평가합니다.ArrayCore는 arraySize를 생성합니다.이 사이즈는 파라미터로 패널의 ArrayOverride 메서드에 전달됩니다.ArrayOverride는 자식의 finalSize를 생성합니다.마지막으로 ArrayCore 메서드는 여백 및 선형과 같은 오프셋 특성을 최종 평가하여 하위 항목을 레이아웃 슬롯에 배치합니다.자녀는 할당된 공간 전체를 채울 필요가 없습니다(대부분 그렇지 않습니다).그런 다음 컨트롤이 상위 패널로 반환되고 레이아웃 프로세스가 완료됩니다.
아마 이게 도움이 될 거야
패널뿐만 아니라 WPF에서 작성하는 모든 응용 프로그램에도 사용할 수 있습니다.
WPF 도면 및 측정 퍼포먼스를 마무리합니다.
대상 운영 체제에 대한 도면 테스트 응용 프로그램, 결과 및 결론 정보도 있습니다.
말씀하신 패널은 레이아웃 패널이므로 레이아웃 시스템의 개요를 보면 단순히 가장 효율적인 패널 목록이 아니라 효율성과 성능에 가장 큰 영향을 미치는 패널을 어떻게 사용하는지 알 수 있습니다.
간단히 말해 레이아웃은 요소의 크기 조정, 배치 및 그리기로 이어지는 재귀적 시스템입니다.보다 구체적으로 레이아웃은 패널 요소의 하위 집합의 구성원을 측정하고 배열하는 프로세스를 설명합니다.레이아웃은 부하가 높은 프로세스입니다.Children 컬렉션이 클수록 수행해야 하는 계산의 수가 증가합니다.집합을 소유한 패널 요소에 의해 정의된 레이아웃 동작을 기반으로 복잡성이 발생할 수도 있습니다.캔버스와 같이 비교적 단순한 패널은 그리드와 같은 보다 복잡한 패널보다 성능이 크게 향상될 수 있습니다.
하위 UIlement가 위치를 변경할 때마다 레이아웃 시스템에 의해 새로운 패스를 트리거할 수 있습니다.따라서 레이아웃 시스템을 호출할 수 있는 이벤트를 이해하는 것이 중요합니다. 불필요한 호출이 애플리케이션 성능 저하로 이어질 수 있습니다.다음은 레이아웃 시스템이 호출될 때 발생하는 프로세스에 대해 설명합니다.
1. 자 UILEment는 우선 그 핵심 특성을 측정함으로써 레이아웃 처리를 시작한다.
2. FrameworkElement에서 정의된 크기 조정 속성(폭, 높이, 여백 등)을 평가합니다.
3. 도킹 방향이나 스태킹 방향 등 패널 고유의 로직이 적용됩니다.
4. 모든 어린이의 측정이 끝난 후에 내용을 정리한다.
5. Children 컬렉션이 화면에 그려집니다.
6. 컬렉션에 추가 Children이 추가되거나 Layout Transform이 적용되거나 Update Layout 메서드가 호출되면 프로세스가 다시 호출됩니다.
어린이의 측정 및 배열에 대한 자세한 내용은 LayoutSystem_Measure_Arrange를 참조하십시오.
Layout System_퍼포먼스:
레이아웃은 재귀 프로세스입니다.하위 컬렉션의 각 하위 요소는 레이아웃 시스템을 호출할 때마다 처리됩니다.따라서 필요하지 않을 때 레이아웃 시스템을 트리거하지 않도록 해야 합니다.다음 사항을 고려하면 성능을 향상시키는 데 도움이 될 수 있습니다.
레이아웃 시스템에 의해 재귀 업데이트가 강제되는 속성 값 변경에 주의하십시오.
값이 레이아웃 시스템을 초기화할 수 있는 종속성 속성은 공용 플래그로 표시됩니다.AffectsMeasure 및 AffectsArrange는 레이아웃 시스템에 의해 재귀적인 업데이트가 강제되는 속성 값 변경에 대한 유용한 단서를 제공합니다.일반적으로 요소의 경계 상자 크기에 영향을 줄 수 있는 속성은 AffectsMeasure 플래그를 true로 설정해야 합니다.자세한 내용은 종속성 속성 개요를 참조하십시오.
가능하면 LayoutTransform 대신 RenderTransform을 사용합니다.
LayoutTransform은 사용자 인터페이스(UI)의 내용에 영향을 주는 매우 유용한 방법입니다.단, 변환의 효과가 다른 요소의 위치에 영향을 줄 필요가 없는 경우에는 RenderTransform을 사용하는 것이 좋습니다.RenderTransform은 레이아웃 시스템을 호출하지 않기 때문입니다.LayoutTransform은 변환을 적용하고 영향을 받는 요소의 새 위치를 고려하도록 재귀 레이아웃 업데이트를 강제합니다.
UpdateLayout에 대한 불필요한 호출을 피합니다.
UpdateLayout 메서드는 강제로 재귀 레이아웃 업데이트를 수행하며 대부분의 경우 필요하지 않습니다.완전한 업데이트가 필요한 경우를 제외하고 레이아웃 시스템을 사용하여 이 메서드를 호출하십시오.
대규모 Children 컬렉션을 사용하는 경우 일반 StackPanel 대신 Virtualizing StackPanel을 사용하는 것이 좋습니다.
하위 컬렉션을 가상화함으로써 Virtualizing StackPanel은 현재 상위 ViewPort 내에 있는 개체만 메모리에 유지합니다.그 결과 대부분의 시나리오에서 성능이 크게 향상되었습니다.
퍼포먼스 최적화: 레이아웃 및 설계:이 문서에서는 트리를 효율적으로 구축하는 방법에 대해 자세히 설명하고 복잡성에 따라 패널의 간단한 목록을 제공합니다.
캔버스(최소 완성도 = 더 효율적이고 더 나은 성능)
격자무늬
기타 패널(복잡화 = 효율성이 떨어지고 성능이 저하됨)
기타 퍼포먼스에 관한 고려사항: WPF UI 렌더링 속도를 향상시키는 방법
- 모든 것을 캐시합니다.브러시, 색상, 지오메트리, 서식 지정된 텍스트, 글리프(예: 두 가지 클래스가 있습니다.RenderTools 및 TextCache.두 클래스의 공유 인스턴스에 대한 각 장치 주소의 렌더링 프로세스.따라서 두 차트의 텍스트가 같은 경우 해당 준비는 한 번만 실행됩니다.)
- 장시간 사용할 예정이라면 프리즈 프리저블을 사용하세요.특히 기하학이 그렇습니다.동결되지 않은 복잡한 형상은 HitTest를 매우 느리게 실행합니다.
- 각 프리미티브의 가장 빠른 렌더링 방법을 선택합니다.예를 들어 텍스트 렌더링에는 약 6가지 방법이 있지만 가장 빠른 방법은 DrawingContext입니다.그리프
- 컨테이너 재활용을 유효하게 합니다.가상화를 통해 성능이 크게 향상되지만 컨테이너는 폐기되고 다시 작성됩니다.기본값이 이 값입니다.그러나 VirtualizingStackPanel을 설정하면 컨테이너를 재활용하여 성능을 높일 수 있습니다.가상화 모드="재활용"
- 여기서부터:응용 프로그램에서 지원할 수 있는 중첩의 양에는 실질적인 제한이 없지만 일반적으로 원하는 레이아웃에 실제로 필요한 패널만 사용하도록 응용 프로그램을 제한하는 것이 좋습니다.대부분의 경우 배치 컨테이너로서의 유연성 때문에 중첩 패널 대신 그리드 요소를 사용할 수 있습니다.이를 통해 불필요한 요소가 트리에 포함되지 않도록 함으로써 응용 프로그램의 성능이 향상될 수 있습니다.
언급URL : https://stackoverflow.com/questions/9946811/in-what-order-are-panels-the-most-efficient-in-terms-of-render-time-and-performa
'source' 카테고리의 다른 글
UILabel에서 줄 간격을 제어하는 방법 (0) | 2023.04.16 |
---|---|
Git 저장소에서 삭제된 파일을 찾아서 복원하려면 어떻게 해야 하나요? (0) | 2023.04.16 |
치명적 오류: 클래스에 구현되지 않은 이니셜라이저 'init(코더:)'을 사용합니다. (0) | 2023.04.16 |
cmd.exe에서 사용하는 인코딩/코드 페이지는 무엇입니까? (0) | 2023.04.16 |
XAML에서 Canvas's Children 속성을 바인딩할 수 있습니까? (0) | 2023.04.16 |