WPF UI 렌더링 속도를 향상시키는 방법
WPF 어플리케이션의 화면에 많은 원시 컨트롤이 포함되어 있는 경우 렌더링이 느려집니다.그러한 경우에 WPF 애플리케이션의 응답성을 개선하기 위해 권장되는 방법은 제어장치를 적게 추가하고 보다 강력한 비디오 카드를 사용하는 것 외에 무엇인가?
어떻게 해서든 오프스크린 버퍼링 같은 것을 사용할 수 있는 방법이 있습니까?
우리 팀은 성능 저하 문제에 직면했다.우리의 경우, 약 400개의 수송 유닛이 있으며, 우리는 많은 세부사항(텍스트 라벨, 특수 마크, 다른 기하학 등)으로 각 유닛의 차트를 렌더링해야 합니다.
처음에 구현에서는 각 차트를 기본 요소로 분할하고 바인딩을 통해 전체 유닛 차트를 구성했습니다.그것은 매우 슬픈 경험이었다.UI 반응이 매우 느렸습니다.
그래서 각 유닛당 하나의 UI 요소를 만들고 Drawing Context를 사용하여 차트를 렌더링하기로 했습니다.퍼포먼스 측면에서는 훨씬 나아졌지만 렌더링 개선에는 약 1개월이 소요되었습니다.
몇 가지 조언:
- 모든 것을 캐시합니다.를 들어, 상, 오, 오, 예, 예, 예, 예, 예, 예 (: 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 예, 두 가지 클래스가 있습니다.
RenderTools
★★★★★★★★★★★★★★★★★」TextCache
두의 공유 각 유닛 렌더링 각 유닛 주소의 양쪽 클래스의 공유 인스턴스에 렌더링하는 프로세스.을 참조해 주세요. Freezable
기하학특히 기하학이 그렇습니다.동결되지 않은 복잡한 형상은 HitTest를 매우 느리게 실행합니다.- 각 프리미티브의 가장 빠른 렌더링 방법을 선택합니다.들어 에는 약 가장 방법은 6가지입니다.
DrawingContext.DrawGlyphs
- 프로파일러를 사용하여 핫스팟을 검출합니다.예를 들어, 프로젝트에서는 지오메트리를 캐시하여 필요에 따라 적절히 렌더링했습니다.개선은 불가능할 것 같습니다.하지만 어느 날 지오메트리를 한 번 렌더링하여 캐시 가능한 비주얼을 만들면 어떨까 생각했습니다.우리의 경우, 그러한 접근은 용인할 수 있는 일이었습니다.우리 유닛의 차트에는 몇 가지 상태만 있습니다.차트 데이터가 변경되면 상태별로 DrawingVisual을 재구축하여 캐시에 넣습니다.
물론 이 방법에는 약간의 투자가 필요하고, 지루하고 지루한 작업이지만, 결과는 훌륭합니다.
덧붙여서, WPF 캐싱 옵션(링크를 응답으로 찾을 수 있음)을 켰을 때, 앱이 끊어졌습니다.
1년 전부터 매우 커스터마이즈된 데이터그램에 대해 동일한 성능 문제가 있었습니다. 결론은 다음과 같습니다.
기본적으로 사용자 측에서 할 수 있는 일은 없습니다(즉, 컨트롤 수가 적거나 기본 스타일만 사용하는 등 앱에 영향을 주지 않습니다).
Jens가 말한 링크는 훌륭하지만 당신의 경우에는 쓸모가 없습니다.
NVM이 제공하는 'WPF 애플리케이션 퍼포먼스 최적화' 링크도 제 경험상 거의 쓸모가 없습니다.이것은 상식에 호소할 뿐이며, 읽는 법도 특별한 것은 배울 수 없습니다.단 한 가지 가능성은:이 링크를 통해 앱의 리소스에 최대한 많은 것을 넣을 수 있게 되었습니다.WPF는 사용자가 리소스에 추가한 어떤 것도 재스탠하지 않기 때문에 동일한 리소스를 반복해서 재사용할 뿐입니다.가능한 한 많이 (스타일, 브러시, 템플릿, 글꼴 등)에 넣습니다.
대체적으로 WPF에서는 옵션을 선택하거나 다른 옵션을 끄는 것만으로 작업을 빠르게 진행할 수 있는 방법은 없습니다.MS가 가까운 장래에 렌더링 레이어를 재작업하여 최적화할 수 있도록 하고, 그 사이에 효과나 커스터마이즈 컨트롤 등에 대한 요구를 줄이도록 하면 됩니다.
새로운 (.)를 봐 주세요.NET 4.0) 캐싱 옵션.(여기를 참조).
저도 비슷한 문제를 겪었고 저의 생각과 발견을 공유하고 싶습니다.원래 문제는 약 25개의 복잡한 컨트롤(텍스트 블록이 있는 그리드 및 일부 경로를 표시하는 몇 개의 버튼이 내부에 있음)을 표시하는 가상화 목록 상자에 의해 발생합니다.이 문제를 조사하기 위해 각 컨트롤을 렌더링하는 데 시간이 걸리는 Visual Studio 애플리케이션 타임라인과 PerfView를 사용하여 실제 WPF가 무엇인지 알아냈습니다.각 컨트롤을 렌더링합니다.기본적으로는 각 항목을 렌더링하는 데 약 12ms가 걸렸습니다.목록을 동적으로 업데이트해야 하는 경우 시간이 다소 걸립니다.WPF는 부모-자녀 계층의 항목을 렌더링하기 때문에 PerfView를 사용하여 내부의 어떤 헤펜을 분석하기는 어렵지만, 모든 내부 프로세스에 대한 공통의 이해를 얻을 수 있었습니다.WPF는 목록의 각 항목을 렌더링하기 위해 다음을 수행합니다.
- XAML 리더를 사용하여 템플릿을 해석합니다.내가 보기에 XAML 파싱이 가장 큰 문제입니다.
- 스타일 적용
- 바인딩 적용
스타일과 바인딩을 적용하는데 많은 시간이 걸리지 않습니다.
퍼포먼스를 향상시키기 위해 다음 작업을 실시했습니다.
- 각 버튼에는 자체 템플릿이 있으며, 이 템플릿을 렌더링하는 데 많은 시간이 걸립니다.Buttons를 Borders로 대체했습니다.그 후 각 아이템을 렌더링하는 데 4~5ms 정도 소요됩니다.
- 모든 요소 설정을 스타일로 이동합니다.약 3ms.
- 템플릿에 단일 그리드를 사용하여 사용자 정의 항목 컨트롤을 생성합니다.코드 내의 모든 자 요소를 만들고 TryFindResources 메서드를 사용하여 스타일을 적용합니다.결과는 약 2ms입니다.
이러한 모든 변경 후 성능은 양호해 보이지만 여전히 대부분의 시간이 ListControl을 사용하는 데 소요됩니다.아이템 템플릿과 커스텀 컨트롤 템플릿. 4.마지막 단계: ListControl을 Canvas 및 Scrollbar 컨트롤로 교체합니다.이제 모든 항목이 런타임에 생성되고 위치가 MeasureOverride 및 ArrayOverride 메서드를 사용하여 수동으로 계산됩니다.이제 텍스트 블록 렌더링에 0.5ms가 소요되는 각 항목을 렌더링하는 데 1ms 미만이 소요됩니다.
데이터 변경 시 성능에 큰 영향을 주지 않기 때문에 스타일이나 바인딩을 사용하고 있습니다.이것은 WPF 솔루션이 아니라고 생각할 수 있습니다.하지만 어플리케이션에 비슷한 목록이 몇 개 있어서 템플릿을 전혀 사용하지 않을 수도 있습니다.
언급URL : https://stackoverflow.com/questions/5401549/ways-to-improve-wpf-ui-rendering-speed
'programing' 카테고리의 다른 글
IIS8의 WCF. *.svc 핸들러 매핑이 작동하지 않음 (0) | 2023.04.21 |
---|---|
UITableViewCell은 흰색 배경을 표시하며 iOS7에서는 수정할 수 없습니다. (0) | 2023.04.21 |
Git에서 한 파일의 작업 복사 수정 내용을 실행 취소하시겠습니까? (0) | 2023.04.16 |
크로스 조인이나 데카르트 제품을 엑셀로 하는 방법이 있나요? (0) | 2023.04.16 |
문자열의 큰따옴표 이스케이프 (0) | 2023.04.16 |