通过


WinUI 3 性能优化

本主题介绍如何使用 Windows Performance Toolkit 中的性能监视工具为 WinUI 应用程序生成深层性能配置文件。

如何使用 Windows 性能记录器监视 WinUI 应用?

Windows性能记录器(WPR)可用于基于内置配置文件创建详细的Event Tracing for Windows(ETW)记录,以捕捉系统和应用程序的行为以及资源使用情况。 然后,Windows Performance Analyzer (WPA) 可以处理这些 ETW 记录,以生成一组图形和表,可方便使用并深入分析 CPU 使用率、电源问题、系统或应用程序性能不佳以及其他性能问题。

注释

虽然 WPR 有 GUI 和命令行版本,但本主题仅提及 GUI 版本(有关这两个版本的更多详细信息,请参阅 WPR 简介)。

WPR 剖面

WPR 分析文件用于收集有关应用程序的各个方面和行为的信息。

在下图中,显示了“Windows 性能记录工具”窗口,其中选择了“CPU 使用率”配置文件(显示系统上每个 CPU 的使用情况)和“XAML 活动”配置文件(显示来自 XAML 相关提供程序的事件:例如 WinUI)。

Windows 性能记录器的屏幕截图,选择了 CPU 使用率和 XAML 活动分析。

如何将 Windows Performance Analyzer 与 WinUI 应用配合使用?

WinUI 是声明性保留模式 API,其中应用描述 UIElements 树,WinUI 运行布局并呈现布局。 这在 UI 线程上以称为“帧”的批处理方式完成,最好在显示的一个刷新间隔内快速完成。 当帧运行时间较长时,不仅会延迟其显示更新,而且还会阻止 UI 线程处理输入。 帧速慢虽然不是响应问题的唯一原因,但也是最常见的原因之一。

安装“XAML 帧分析”插件

WinUI 记录跟踪每个帧的开始和停止的 ETW 事件(如以下 WPA“泛型事件”表的屏幕截图所示)。 但是,由于需要手动计算每个帧的持续时间,因此很难识别帧出现缓慢的情况。

这是 Windows 性能分析器的屏幕截图,显示了包含一系列帧启动和停止的泛型事件表。

若要解决此问题,Windows评估工具包(ADK) 10.1.26100.1 及更高版本随附新的“XAML 帧分析”表插件。 此表计算并显示每个帧的持续时间(以及其他耗时的操作)。

注释

“XAML 帧分析”表需要Windows ADK 10.1.26100.1 或更高版本Windows Performance Analyzer(WPA)。 用于跟踪的 WPR 版本并不重要。

安装 ADK 后,必须通过编辑 WPA 文件夹中的“perfcore.ini”配置文件(通常为 C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit 来启用“XAML 帧分析”表。 为此,请关闭 WPA 的任何打开实例,在文本编辑器中打开“perfcore.ini”,将 perf_xaml.dll 添加到 dll 列表,然后保存并关闭文件。 重启 WPA,现在应在“系统活动”部分底部显示“XAML 帧分析”图。

“系统活动”部分底部显示 XAML 帧分析表的 Windows Performance Analyzer 的屏幕截图。

使用“XAML 帧分析”插件

Xaml 帧分析支持两个视图(两个视图都显示相同的列):

  • “有趣的 Xaml 帧”(默认)- 显示基于启发法识别出的 WinUI 帧,这些帧最有可能导致响应性问题。 这些对应于从 WinUI 初始化、帧导航或浮出控件显示等操作开始的区域,并在下一帧结束时停止。 这些方案通常涉及对 UIElement 树的大量更改,并且最容易遇到性能问题。
  • “所有 Xaml 信息” - 显示追踪中所有进程的所有 WinUI 框架。 对于帧或布局处理等操作,插件会自动根据开始和停止事件计算并显示持续时间。

以下屏幕截图突出显示如何在 Xaml 帧分析视图之间切换。

Windows 性能分析器的屏幕截图,显示 Xaml 帧分析表的视图选择器。

这两个 Xaml 帧分析视图包含以下列:

标题 价值
过程 进程名称和 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 执行时间。
启动 (s) 启动事件的时间
停止 (s) 停止事件的时间

列可以按类型或持续时间进行排序,以帮助识别潜在问题,例如跟踪中最昂贵、持续时间最长的帧(请参阅下图)。 您还可以深入分析特定行,以确定消耗资源的操作和潜在的优化。

显示“所有 XAML 信息”表(按“持续时间”(ms) 排序)的 Windows Performance Analyzer 的屏幕截图。