WPF 性能套件

Windows SDK 包括一套用于 Windows Presentation Foundation (WPF) 应用程序的性能分析工具,称为“WPF 性能套件”。 使用 WPF 性能套件能够分析 WPF 应用程序的运行时行为,并确定可以应用的性能优化。 WPF 性能套件包括称为分析器和可视探查器的性能分析工具。 本主题介绍如何安装和使用 WPF 性能套件中的分析器和可视探查器工具。

本主题包含以下各节:

  • 安装 WPF 性能套件

  • 启动 WPF 性能套件

  • 分析器

  • 可视探查器

安装 WPF 性能套件

以下步骤介绍如何安装 WPF 性能套件。

  1. 如果已安装早期版本的 Windows 性能工具包,请将其卸载。

  2. 安装 Windows SDK。

    在安装选项中,确保选择“常用实用工具”下的“Windows 性能工具包”选项。 有关下载信息,请参阅 Windows SDK 下载页

  3. 安装 Windows SDK 后,在“开始”菜单中选择“所有程序”,之后选择“Microsoft Windows SDK v7.1”,然后再选择“工具”。

  4. 在“工具”下,单击“安装 Windows 性能工具包”。

    随即显示安装向导。

  5. 按照显示的说明安装 Windows 性能工具包。

    默认情况下,将安装以下功能。

    • 性能分析器

    • Windows 性能工具包帮助

    • GPUView

    • WPF 性能套件

启动 WPF 性能套件

首先应启动 WPF 性能套件,然后再运行要分析的应用程序。 若要使用 WPF 性能套件,用户帐户必须拥有管理特权。

以下步骤介绍如何启动 WPF 性能套件。

  1. 在“开始”菜单中,选择“所有程序”,然后再选择“Microsoft Windows 性能工具包”。

  2. 单击“WPF 性能套件”。

  3. 如果出现“用户帐户控制”对话框,请单击“是”。

    随即启动 WPF 性能套件。

首次启动 WPF 性能套件时,会出现“添加工具”对话框。 可在“添加工具”对话框中添加性能分析工具。 若要添加工具,请选择包含工具的程序集,然后单击“扫描程序集”。 可通过从“文件”菜单中单击“添加工具”,随时打开“添加工具”对话框。 下图显示“添加工具”对话框。

“添加工具”对话框

“添加工具”对话框

默认情况下,WPF 性能套件包括以下性能分析工具。

工具

描述

分析器

分析呈现行为。

可视化探查器

按可视化树中的元素分析 WPF 服务(如布局和事件处理)的使用。

请确保勾选“分析器”和“可视探查器”复选框,然后单击 确定

分析器

分析器是用于分析 WPF 应用程序呈现行为的性能分析工具。 分析器用户界面会显示一组图形,用以分析应用程序各个部分非常具体的呈现行为,如已更新矩形增加速率和帧速率。 WPF 使用称为“已更新矩形”的呈现技术,这意味着在新呈现处理过程中只呈现屏幕中已更改的部分。 此外,分析器具有多个可用于查找特定呈现问题的选项。 分析器还会报告软件呈现目标和滑块,以控制图形的持续时间。 下图显示了分析器用户界面。

分析器用户界面

“添加工具”对话框

Aa969767.collapse_all(zh-cn,VS.110).gif使用分析器

若要使用分析器,请启动要分析的 WPF 应用程序。 启动该应用程序后,请依次分别单击“分析器”选项卡、“操作”菜单和“选择进程”。 在“选择进程”对话框中,选择要分析的应用程序进程,然后单击“选择”。 该进程名称和进程 ID 现在应出现在“分析器”选项卡的顶部。 选择要分析的呈现选项。 分析器数据值(如帧速率)会立即反映应用程序的呈现行为。 下图显示了一个示例。

选定了应用程序和呈现选项的分析器

选定了选项的 Perforator 主窗口

Aa969767.collapse_all(zh-cn,VS.110).gif分析器关系图

若要高效呈现 WPF 应用程序,请务必使帧速率、已更新矩形增加速率和中间呈现目标保持较低值。 分析器具有很多用于监控这些级别的有用关系图。

下表描述了每个关系图报告的度量值。

历史记录关系图

描述

注释

帧速率

报告应用程序向屏幕进行呈现的速率。

对于不包含动画的应用程序,此值应接近于 0。 在性能良好的应用程序的动画中,帧速率应接近监视器的刷新频率(通常为 60 或 75)。

已更新矩形增加速率

指示 WPF 必须为每帧更新的矩形区域数量。

更新的矩形是一种呈现技术,此技术只呈现屏幕中已发生更改的部分。 如果值较大,则指示大量的区域已发生更改。 这不一定代表性能好或不好,只是一个在考虑应用程序整体性能时应参考的值。

每帧 SW IRT

显示呈现应用程序一个帧所需的软件中间呈现器目标 (IRT) 数量。

IRT 是成本昂贵的软件图面,WPF 必须向其中或从其中分配和复制数据。 软件 IRT 的成本高于硬件 IRT 的成本。

形成 IRT 的原因通常是在 Visual 中使用了 DrawingBrushVisualBrushOpacity 属性,或在 TileBrush 中使用了平铺模式。 如果此值较高(例如大于 5),则指示 WPF 运行时正在执行大量工作来呈现应用程序。

在支持硬件加速的计算机上,此值应为 0。 否则,此值指示某些场景是使用速度较慢的软件管道来呈现的。

每帧 HW IRT

显示呈现应用程序一个帧所需的硬件中间呈现器目标 (IRT) 数量。

IRT 是成本昂贵的硬件图面,WPF 必须向其中或从其中分配和复制数据。

形成中间呈现目标的原因通常是在 Visual 中使用了 DrawingBrushVisualBrushOpacity 属性,或在 TileBrush 中使用了平铺模式。 如果此值较高(例如大于 5),则指示 WPF 运行时正在执行大量工作来呈现应用程序。 在这种情况下,必须分析使用前面所提元素的代码的所有区域。

硬件 IRT 的成本高于软件 IRT 的成本。

视频内存使用情况

跟踪为用于纹理和呈现目标而向 WPF 分配的大量视频内存。 此指标不跟踪向视频驱动器分配的内存或用于编译与加载像素和顶点着色器的内存分配。

超出可用纹理内存量通常将导致 WPF 呈现逻辑回退到软件,并且多个显示(多监视器)会对应用程序所需的视频内存量产生乘法效果。

Aa969767.collapse_all(zh-cn,VS.110).gif分析器呈现选项和优化呈现

使用分析器能够设置影响应用程序实时呈现行为的多个呈现选项。 可通过设置这些选项,查看应用程序中可能存在问题的呈现事件。 这些选项位于用户界面的下半部分。

下图显示了分析器呈现选项。

分析器呈现选项

Perforater 呈现选项

一般情况下,若要提高 WPF 应用程序的性能,应最大限度地减少软件呈现并降低中间呈现目标的数量。 以下各节讨论分析器如何帮助你达到此目的。

Aa969767.collapse_all(zh-cn,VS.110).gif避免软件呈现

由于 WPF 硬件呈现管道明显快于 WPF 软件呈现管道,因此在软件中呈现的应用程序用户界面越少,应用程序的程序就会越快。 通常,在软件中呈现某一区域所需的时间与呈现的像素数成正比。 因此,应谨慎地使用软件管道呈现大型区域。 小型区域在这方面的顾虑要少一些。

下面的表格列出了有助于检测软件呈现问题的分析器选项。

选项

描述

注释

用紫色浅色绘制软件呈现

用紫色浅色绘制使用软件呈现管道所呈现的所有区域。 这包括软件呈现目标、软件三维内容和逐基元软件回退。

WPF 硬件呈现管道明显快于其软件呈现管道。 通常情况下,软件呈现过多指示存在问题。 导致此种行为的示例包括,平铺过多的 Brush 或超出了视频卡的纹理大小。

用红色浅色绘制软件呈现位图效果

用红色浅色绘制旧式软件呈现位图效果

软件呈现的 BitmapEffect 类速度较慢,应避免使用。 应使用 .NET Framework 3.5 SP1 中引入的硬件呈现的 Effect 类。

下图显示启用了“用紫色浅色绘制软件呈现”呈现选项的 PhotoDemo 示例应用程序。

使用紫色浅色的 PhotoDemo

显示 Perforator 呈现选项的 Photodemo 应用程序

Aa969767.collapse_all(zh-cn,VS.110).gif监控更新区域

由于 WPF 只根据需要更新窗口的某些部分,因此这有助于随时可视化更新。 在某些情况中,尽管应用程序中未出现动画,但仍将继续更新区域。 下面的选项将帮助可视化更新行为。 当 WPF 必须通过网络发送新位图时,在远程桌面、虚拟机和类似方案中的不必要更新尤为重要。 此外,不必要的更新可影响笔记本电脑电池寿命。

选项

描述

注释

显示已更新区域的更新覆盖

使 WPF 对屏幕所做的每次更新都通过重新着色进行指示。 这样便可以查看应用程序中重绘区域的时间和位置。

由于 WPF 只根据需要更新窗口的某些部分,因此这有助于随时可视化窗口正在更新的部分。 当帧速率和已更新矩形添加速率不为零但应用程序中没有可视化对象更改时,使用此选项。

禁用已更新区域支持

使 WPF 在进行更改时随时重绘整个窗口。

此选项有助于强制整个窗口进行更新。 正常情况下,只重绘已更改窗口部分。 启用此选项会严重减缓应用程序的呈现速度。

在呈现之前清除后台缓存区

在每次绘制操作之前,清除应用程序窗口。

此选项可用来替代“显示已更新区域的更新覆盖”选项。 它可高效地显示最近已更新区域,而已更新区域的更新覆盖则更有助于查看已更新区域在一段时间内的更改。

Aa969767.collapse_all(zh-cn,VS.110).gif检测性能降级的其他根源

分析器能够禁用某些性能要求较高的操作,以确定它们是否在应用程序中引起瓶颈。 通过监控应用程序帧速率并分别勾选这些选项,可以确定这些操作(如三维呈现或映像重新缩放)是否会引起呈现问题。 如果勾选了其中一个选项并且帧速率明显下降,便可确定应用程序中的瓶颈。

选项

描述

注释

禁用不透明度效果

禁用使用某些潜在性能要求较高的不透明度。

若要总体上避免这种性能问题,请考虑在低级别对象(如 Brush),而不是在高级别对象(如 Button)中设置不透明度。

禁用逐基元软件回退

禁用各个呈现基元的软件回退。 无法禁用软件中间呈现目标和其他软件呈现。

在大多数情况下,不需要勾选此选项。 请将其保持为未选中状态。

禁用高质量映像重新缩放

禁止将大图像重新缩放至较小大小图像。

能够在应用程序中查看图像重新缩放的效果。 如果勾选此选项会显著降低帧速率,请考虑将图像解码为与其显示大小接近的大小。

禁用三维呈现

禁用所有三维呈现操作

能够在应用程序中查看三维呈现操作的效果。

可视化探查器

可视探查器是 WPF 服务(如布局、呈现和动画)中用于可视化树中元素的性能分析工具。 通过分析此工具的分析输出,可以确定应用程序中的哪些可视元素可能会导致性能瓶颈。

可视探查器显示了用于构造应用程序中可视化场景的基本构建基块的上下文中的性能问题。 这些构建基块包括高级别对象(如 ButtonTextBlock 控件),和低级别对象(如 LineEllipse 元素)。 可视探查器并不是通过函数名称的调用关系图描述性能问题,而是通过使用可视化对象的表现形式来描述这些问题。 这种方式与 Windows SDK 工具 UI Spy 表示信息的方式相类似。 有关详细信息,请参阅 UISpy.exe (UI Spy)

Aa969767.collapse_all(zh-cn,VS.110).gif使用可视探查器

若要使用可视探查器,请启动要分析的 WPF 应用程序。 启动该应用程序后,请依次分别单击“可视探查器”选项卡、“操作”菜单和“选择进程”。 在“选择进程”对话框中,选择要分析的应用程序进程,然后单击“选择”。 该进程名称和进程 ID 现在应出现在“可视探查器”选项卡的顶部。

若要分析 WPF 性能问题的范围,必须了解基础 WPF 服务的角色和范围。 这些服务包括布局、呈现和动画。 可视探查器用图形表示形式展现 WPF 服务在应用程序对象之间的分配方式。 例如,当可视探查器显示应用程序对象的可视化树时,它会在对象上覆盖不同的红色色调,以便表示该对象正在使用的相对资源量。 用较深红色覆盖的显示对象使用的资源比例要高于用较浅红色覆盖的显示对象。 更重要的是,可视探查器提供了对象所消耗的特定 WPF 资源量的细分。

下图显示了可视探查器用户界面。

可视探查器用户界面

可视化探查器用户界面

可视探查器用户界面包含八个区域。

  1. 元素树搜索框

  2. 可视元素树

  3. 元素详细信息和预览

  4. 元素独占 CPU 使用率详细信息

  5. 应用程序 CPU 使用率详细信息

  6. 已捕获数据的缩放控件

  7. 历史记录关系图显示设置

  8. 应用程序预览和性能覆盖选项

以下各节会介绍每个区域。

Aa969767.collapse_all(zh-cn,VS.110).gif元素树搜索框

通过“元素树”部分的搜索框可在应用程序元素树中搜索元素。 执行搜索时,所有匹配元素都以黄色突出显示。 可以按照元素的类型或名称进行搜索。

Aa969767.collapse_all(zh-cn,VS.110).gif可视元素树

“元素树”部分的树控件显示应用程序中可视元素的类型和名称以及子树大小和布局详细信息。

以下是树中元素标签的示例。

Border 'border1' (26) 0.02% (I)/ 0.00 % (E) - .24 ms (I) / 0.00 ms (E)

元素标签部分

描述

Border

元素类型。

'border1'

元素名称。

(26)

子树大小。

0.02%(I)

相容树总大小百分比,相容树是元素及其所有子代。

0.00 (E)

仅针对该元素的总元素百分比。

.24 ms (I)

对该元素及其子代进行布局所用的时间(以毫秒为单位)。

0.00 ms (E)

仅对该元素进行布局所用的时间(以毫秒为单位)。

使用“视图”菜单控制是否显示非独占/独占的百分比/时间信息。

右键单击某个元素,以展开或折叠子树。 还可以展开其热路径。 热路径显示子树中 CPU 消耗量最高的元素。

Aa969767.collapse_all(zh-cn,VS.110).gif元素详细信息和预览

“元素信息”部分显示当前选定的元素类型和名称(如果该元素已命名)。 还可在“预览”部分提供元素预览。 如果选择了最顶层的元素,则预览会显示应用程序的预览。

Aa969767.collapse_all(zh-cn,VS.110).gif元素独占 CPU 使用率详细信息

“元素独占 CPU 使用率”部分显示选定元素在一段时间内使用的独占 CPU 时间的历史记录关系图和详细信息。 例如,元素可能在布局安排上花费 x% CPU 时间,在布局测量上花费 y% 时间以及在呈现上花费 z% 时间。

Aa969767.collapse_all(zh-cn,VS.110).gif应用程序 CPU 使用率详细信息

“应用程序 CPU 使用率”部分显示应用程序事件的历史记录关系图和详细信息。 可视探查器会侦听并捕获各种应用程序事件。 应用程序事件会使用绝对值列出,并且历史记录关系图会使用不同的颜色显示在一段时间内花费在每个应用程序事件上的 CPU 时间。 这样,便可以轻松地查看应用程序花费在布局与呈现上的时间。

下表描述了关系图中表示的应用程序事件。

备注

对应于 WPF 中方法调用的事件会按照方法名称显示(后接括号括起的类名)。例如,“Tick (TimeManager)”表示 TimeManager.Tick 方法。

应用程序事件

说明

Unlabeled Time

在 WPF 中的另一个应用程序事件中所花费的未分类时间和 WPF 外部应用程序所花费的时间

RenderMessageHandler (MediaContext)

在启动呈现处理时发生。 此事件导致时间管理器在其他事件中进行计时周期数。

Rendering Thread

在呈现线程上执行呈现指令时发生。 这有助于检测呈现器绑定的应用程序。

布局

在测量、安排和呈现处理过程中发生。

UpdateRealizations

当更新文本和位图效果的内部位图表示形式时发生。

Tick (TimeManager)

在动画运行时发生。 此事件可以触发动画呈现器处理程序。

当对 WPF 中对象进行动画处理时,时间管理器会管理为时间线创建的 Clock 对象。 时间管理器是 Clock 对象树的根,并控制该树中的时间流。 会自动创建每个 WPF 应用程序的时间管理器,并对应用程序开发人员不可见。 时间管理器每秒进行很多次“计时周期数”。 每秒进行的实际计时周期数因可用系统资源而异。

AnimatedRenderMessageHandler (MediaContext)

对动画进行处理和更新操作时发生。 当启用动画时,此处理程序会处理并更新动画,从而导致属性更改并进行呈现。

Render (MediaContext)

在呈现处理过程中发生。 此方法最终调用每个元素的 OnRender 方法,并有助于了解所有元素的 OnRender 的总成本。 此事件对应于 Visual Studio 探查器 (VSP) 文件中的 MediaContext.Render 方法。

Aa969767.collapse_all(zh-cn,VS.110).gif已捕获数据的缩放控件

“关系图选项”部分包括一个捕获数据缩放控件。 通过拖动缩放窗口手柄,可以调整和更改“元素独占 CPU 使用率”和“应用程序 CPU 使用率”历史记录关系图的时间轴。

Aa969767.collapse_all(zh-cn,VS.110).gif历史记录关系图显示设置

“关系图选项”部分包括用来调整历史记录关系图设置的单选按钮和滑块。 使用单选按钮可指定 CPU 轴(垂直轴)的行为;它显示的是绝对权重还是相对权重。 使用滑块来设置关系图所显示的最大值。

Aa969767.collapse_all(zh-cn,VS.110).gif应用程序预览和性能覆盖选项

“控制选项”部分包含三个用于执行以下操作的切换按钮。

  • 单击第一个切换按钮来暂停或启动可视探查器数据收集。

  • 单击“实时预览”切换按钮来显示“预览”部分中的应用程序实时预览。

  • 单击“覆盖窗口”切换按钮以在所选的可视元素周围添加黄色边框。 此外,对于使用最多 CPU 时间的元素,将添加红色覆盖。 可将相同的红色用于“元素树”部分的元素。 红色的深浅度与 CPU 使用率相关联。

请参见

概念

UISpy.exe (UI Spy)

其他资源

优化 WPF 应用程序性能

图形呈现层

WPF 图形呈现疑难解答

WPF 性能分析工具的新增功能