WinUI 3 성능 최적화

이 항목에서는 Windows Performance Toolkit 성능 모니터링 도구를 사용하여 WinUI 애플리케이션에 대한 심층적인 성능 프로필을 생성하는 방법을 설명합니다.

Windows 성능 레코더를 사용하여 WinUI 앱을 모니터링하려면 어떻게 해야 하나요?

WPR(Windows 성능 레코더)을 사용하여 기본 제공 프로필을 기반으로 시스템 및 애플리케이션 동작 및 리소스 사용량에 대한 자세한 ETW(Windows용 이벤트 추적) 기록을 만들 수 있습니다. 그런 다음 WPA(Windows 성능 분석기)에서 이러한 ETW 기록을 처리하여 CPU 사용량, 전원 문제, 시스템 또는 애플리케이션 성능 저하 및 기타 성능 문제를 보다 쉽게 사용하고 심층 분석할 수 있도록 그래프 및 테이블 집합을 생성할 수 있습니다.

메모

WPR의 GUI 및 명령줄 버전이 모두 있지만 이 항목은 GUI 버전만 참조합니다(두 버전에 대한 자세한 내용은 WPR 소개 참조).

WPR 프로필

WPR 프로필은 앱의 다양한 측면 및 동작에 대한 정보를 수집하는 데 사용됩니다.

다음 이미지에서 Windows 성능 레코더 창은 "CPU 사용량" 프로필(시스템의 각 CPU에 대한 CPU 사용률) 및 "XAML 활동" 프로필(WinUI와 같은 XAML 관련 공급자의 이벤트)이 선택된 상태로 표시됩니다.

CPU 사용량 및 XAML 활동 프로필이 선택된 Windows 성능 레코더의 스크린샷

WinUI 앱에서 Windows Performance Analyzer 사용하려면 어떻게 해야 하나요?

WinUI는 앱이 UIElements 트리를 설명하고 WinUI가 레이아웃을 실행하고 렌더링하는 선언적 보존 모드 API입니다. 이 작업은 "프레임"이라는 일괄 처리로 UI 스레드에서 수행되며, 이는 디스플레이의 한 새로 고침 간격 내에서 빠르게 완료되어야 합니다. 프레임이 오래 실행되면 업데이트가 디스플레이에 표시되지 않도록 지연할 뿐만 아니라 UI 스레드가 입력을 처리하지 못하게 합니다. 느린 프레임은 응답성 문제의 유일한 이유는 아니지만 가장 일반적인 이유 중 하나입니다.

"XAML 프레임 분석" 플러그 인 설치

WinUI는 각 프레임의 시작 및 중지를 추적하는 ETW 이벤트를 기록합니다(WPA "제네릭 이벤트" 테이블의 다음 스크린샷에 표시됨). 그러나 각 프레임의 기간을 수동으로 계산해야 하므로 느린 프레임 발생을 식별하기는 어렵습니다.

일련의 프레임 시작 및 중지가 있는 제네릭 이벤트 테이블을 보여 주는 Windows 성능 분석기 스크린샷

이 문제를 해결하기 위해 새 "XAML 프레임 분석" 테이블 플러그 인이 Windows ADK(평가 도구 키트) 10.1.26100.1 이상에 포함되어 있습니다. 이 표에서는 각 프레임의 기간을 계산하고 보여 줍니다(다른 시간이 많이 걸리는 작업과 함께).

메모

"XAML 프레임 분석" 테이블에는 Windows ADK 10.1.26100.1 이상의 WPA(Windows Performance Analyzer)가 필요합니다. 추적을 수행하는 데 사용되는 WPR 버전은 중요하지 않습니다.

ADK가 설치되면 WPA 폴더에서 "perfcore.ini" 구성 파일(일반적으로 C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit)을 편집하여 "XAML 프레임 분석" 테이블을 사용하도록 설정해야 합니다. 이렇게 하려면 열려 있는 WPA 인스턴스를 닫고, 텍스트 편집기에서 "perfcore.ini"을 연 다음, dll 목록에 perf_xaml.dll를 추가하고, 파일을 저장한 후 닫습니다. WPA를 다시 시작합니다. 이제 시스템 작업 섹션의 맨 아래에 "XAML 프레임 분석" 그래프가 표시됩니다.

시스템 작업 섹션의 맨 아래에 있는 XAML 프레임 분석 테이블을 보여 주는 Windows 성능 분석기 스크린샷

"XAML 프레임 분석" 플러그 인 사용

Xaml 프레임 분석은 두 개의 뷰를 지원합니다(두 보기 모두 동일한 열을 표시).

  • "흥미로운 Xaml 프레임"(기본값) - 응답성 문제를 일으킬 가능성이 가장 큰 추론을 기반으로 WinUI 프레임을 표시합니다. 이러한 영역은 WinUI 초기화, 프레임 탐색 또는 플라이아웃 표시와 같은 작업으로 시작하고 다음 프레임의 끝부분에 중지되는 지역에 해당합니다. 이러한 시나리오는 일반적으로 UIElement 트리에 대한 광범위한 변경 내용을 포함하며 성능 문제에 가장 취약합니다.
  • "모든 Xaml 정보" - 추적에 있는 모든 프로세스의 모든 WinUI 프레임을 표시합니다. 프레임 또는 레이아웃 패스와 같은 작업의 경우 플러그 인은 시작 및 중지 이벤트에 따라 기간을 자동으로 계산하고 표시합니다.

다음 스크린샷은 Xaml 프레임 분석 보기 간에 전환하는 방법을 강조 표시합니다.

Xaml 프레임 분석 테이블의 보기 선택기를 보여 주는 Windows 성능 분석기 스크린샷

두 Xaml 프레임 분석 보기에는 다음 열이 포함됩니다.

Title 가치
프로세스 프로세스 이름 및 ID
스레드 ID 스레드 ID
유형 행에 해당하는 이벤트를 설명합니다. 가능한 값에는 다음이 있습니다.
  • WXM::InitializeForCurrentThread - WindowsXamlManager.InitializeForCurrentThread에 대한 호출입니다. 스레드에서 WinUI를 초기화합니다.
  • DWXS::Initialize - DesktopWindowXamlSource.Initialize에 대한 호출입니다. WinUI 아일랜드를 초기화합니다.
  • 프레임 - UI 스레드의 프레임입니다. 레이아웃을 실행하고 이전 프레임 이후 트리의 변경 내용을 렌더링합니다.
  • 그래픽 디바이스 만들기 - WinUI용 D3D 및 D2D 디바이스를 만듭니다. 백그라운드 스레드에서 발생합니다.
  • UpdateLayout - UI 스레드에 대한 레이아웃 전달입니다. 프레임의 일부로 발생하지만 UIElement.UpdateLayout을 통해 앱에서 트리거할 수도 있습니다.
  • Frame::Navigating - WinUI는 Frame.Navigating 이벤트를 발생합니다.
  • Frame::Navigated - WinUI가 Frame.Navigated 이벤트를 발생합니다.
  • Hwnd 포커스 - 활성 Hwnd가 변경되었습니다.
  • 관심 지역 - 흥미로운 시나리오를 위해 플러그 인에서 계산한 지역입니다. WinUI 초기화, 프레임 탐색 및 메뉴 열기와 같은 이벤트 후에 시작됩니다. 다음 프레임의 끝에서 중지됩니다.
흥미롭다 행이 흥미로운 것으로 간주되는지 여부입니다. 흥미로운 Xaml 프레임 보기에는 흥미로운 행만 표시됩니다.
기간(밀리초) 행의 지속 시간입니다. 시작 및 중지 이벤트에서 계산됩니다.
가중치(ms) 기간에 해당하는 실제 CPU 실행 시간입니다.
시작(들) Start 이벤트의 시간
중지 Stop 이벤트의 시간

열을 형식 또는 기간별로 정렬하여 추적에서 가장 비용이 많이 들고 가장 긴 기간 프레임과 같은 잠재적인 문제를 식별할 수 있습니다(다음 이미지 참조). 특정 행으로 드릴다운하여 비용이 많이 드는 작업 및 잠재적 최적화를 식별할 수도 있습니다.

기간(ms)을 기준으로 정렬된 모든 XAML 정보 테이블을 보여 주는 Windows 성능 분석기 스크린샷