博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

WPF 性能套件

Posted on 2012-02-10 16:21  十一郞  阅读(1582)  评论(0编辑  收藏  举报

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

本主题包含以下各节:

安装 WPF 性能套件

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

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

  2. 安装 Windows SDK。

    在安装选项中,确保已选择“常用实用工具”[Common Utilities]下的“Windows 性能工具包”[Windows Performance Toolkit]选项。 有关下载信息,请参见 Windows SDK Download Page(Windows SDK 下载页)。

  3. 在安装 Windows SDK 之后,在“开始”菜单上依次选择“所有程序”“Microsoft Windows SDK v7.1”“工具”

  4. 在“工具”下,单击“安装 Windows 性能工具包”[Install Windows Performance Tool Kit]

    安装向导随即出现。

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

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

    • 性能分析器

    • Windows 性能工具包帮助

    • GPUView

    • WPF 性能套件

启动 WPF 性能套件

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

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

  1. “开始”菜单中,选择“所有程序”,然后选择“Microsoft Windows 性能工具包”[Microsoft Windows Performance Toolkit]

  2. 单击“WPF 性能套件”[WPF Performance Suite]

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

    WPF 性能套件随即启动。

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

“添加工具”对话框
“添加工具”对话框

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

 

工具

说明

分析器

分析呈现行为。

可视化探查器

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

确保选中“分析器”[Perforator]“可视化探查器”[Visual Profiler]复选框,然后单击“确定”

分析器

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

分析器用户界面
“添加工具”对话框

使用分析器

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

选中了应用程序和呈现选项的分析器
选定了选项的 Perforator 主窗口

分析器关系图

若要高效呈现 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 呈现逻辑回退到软件,并且多个显示(多个监视器)会对应用程序所需的视频内存量产生乘积效果。

分析器呈现选项和优化呈现

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

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

分析器呈现选项
Perforater 呈现选项

 

通常,为了改进 WPF 应用程序的性能,应尽量减少软件呈现,并降低中间呈现目标数。 以下各节讨论分析器如何帮助您做到这一点。

避免软件呈现

因为 WPF 硬件程序管道比其软件呈现管道快得多,所以在软件中呈现的应用程序用户界面越少,应用程序中的呈现速度将越快。 通常,在软件中呈现某一区域所需的时间与呈现的像素数成正比。 因此,应谨慎地使用软件管道呈现大型区域。 小型区域在这方面的顾虑少一些。

下表列出了有助于检测软件程序问题的分析器选项。

 

选项

说明

注释

用紫色淡色绘制软件呈现 [Draw software rendering with purple tint]

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

WPF 硬件呈现管道比其软件呈现管道快得多。 软件呈现过多通常指示存在问题。 导致此行为的示例包括过多地平铺 Brush 或超出视频卡的纹理大小。

用红色淡色绘制软件呈现位图效果 [Draw software rendered bitmap effects with red tint]

使用红色淡色绘制旧式的软件呈现位图效果。

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

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

使用紫色淡色的 PhotoDemo
显示 Perforator 呈现选项的 Photodemo 应用程序

监视已更新区域

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

 

选项

说明

注释

显示已更新区域更新覆盖 [Show dirty-region update overlay]

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

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

禁用已更新区域支持 [Disable dirty region support]

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

此选项对于强制整个窗口进行更新很有用。 通常,只会重绘已更改的窗口部分。 启用此选项将使应用程序的呈现速度大为减慢。

在呈现之前清除后台缓冲区 [Clear back-buffer before rendering]

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

此选项用作“显示已更新区域更新覆盖”的替代方式。 该选项可高效显示最近的已更新区域,而已更新区域更新覆盖对于查看已更新区域在一段时间内的更改更为有用。

检测性能降级的其他根源

通过分析器可以禁用某些造成性能下降的操作,以确定这些操作是否会在应用程序中引起瓶颈。 通过监视应用程序帧速率并分别选择这些选项,可以确定操作(如三维呈现或图像重新缩放)是否会引起呈现问题。 如果选择其中一个选项并且帧速率显著下降,便可能确定应用程序中的瓶颈。

 

选项

说明

注释

禁用不透明度效果 [Disable Opacity Effects]

禁用某些可能会造成性能下降的不透明度效果。

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

禁用逐基元软件回退 [Disable per-primitive software fallback]

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

在多数情况下不需要使用此选项。 请将其保留未选中状态。

禁用高质量图像重新缩放 [Disable high-quality image rescaling]

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

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

禁用三维呈现 [Disable 3D rendering]

禁用所有三维呈现操作

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

可视化探查器

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

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

使用可视化探查器

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

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

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

可视化探查器用户界面
可视化探查器用户界面

可视化探查器用户界面分为八个区域。

  1. 元素树搜索框

  2. 可视化元素树

  3. 元素详细信息和预览

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

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

  6. 捕获的数据缩放控件

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

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

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

元素树搜索框

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

可视化元素树

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

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

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 使用率最高的元素。

元素详细信息和预览

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

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

“元素独占 CPU 使用率”[Element Exclusive CPU Usage]部分显示所选元素在一段时间内使用的独占 CPU 时间的历史记录关系图和详细信息。 例如,一个元素可能在布局排列中花费 x% CPU 时间,在布局测量中花费 y% 时间,在呈现中花费 z% 时间。

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

“应用程序 CPU 使用率”[Application CPU Usage]部分显示应用程序事件的历史记录关系图和详细信息。 可视化探查器会侦听并捕获各种应用程序事件。 应用程序事件使用绝对值列出,历史记录关系图使用不同颜色显示一段时间内在每个应用程序事件中花费的 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 方法相对应。

捕获的数据缩放控件

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

历史记录关系图显示设置

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

用于应用程序预览和性能覆盖的选项

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

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

  • 单击“实时预览”[Live Preview]切换按钮可在“预览”部分显示应用程序的实时预览。

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