WPF Performance Suite
Windows SDK には、WPF Performance Suite という、Windows Presentation Foundation (WPF) アプリケーション用のパフォーマンス プロファイリング ツール群が含まれています。 WPF Performance Suite を使用すると、WPF アプリケーションの実行時の動作を分析し、適用可能なパフォーマンスの最適化を判断することができます。 WPF Performance Suite には、Perforator と Visual Profiler というパフォーマンス プロファイリング ツールが含まれています。 このトピックでは、WPF Performance Suite の Perforator ツールと Visual Profiler ツールのインストール方法と使用方法について説明します。
このトピックは、次のセクションで構成されています。
WPF Performance Suite のインストール
WPF Performance Suite の起動
Perforator
Visual Profiler
WPF Performance Suite のインストール
次の手順では、WPF Performance Suite のインストール方法について説明します。
以前のバージョンの Windows パフォーマンス ツールキットがインストールされている場合は、アンインストールします。
Windows SDK をインストールします。
インストールのオプションで、[共通ユーティリティ] の [Windows パフォーマンス ツールキット] が選択されていることを確認します。 ダウンロードの詳細については、Windows SDK のダウンロード ページを参照してください。
Windows SDK をインストールしたら、[スタート] メニューで [すべてのプログラム]、[Microsoft Windows SDK v7.1]、[ツール] の順に選択します。
[ツール] の [Windows パフォーマンス ツールキットのインストール] をクリックします。
セットアップ ウィザードが表示されます。
表示される指示に従って、Windows パフォーマンス ツールキットをインストールします。
既定では、次の機能がインストールされます。
Performance Analyzer
Windows パフォーマンス ツールキットのヘルプ
GPUView
WPF Performance Suite
WPF Performance Suite の起動
プロファイルするアプリケーションを実行する前に、WPF Performance Suite を起動する必要があります。 WPF Performance Suite を使用するには、ユーザー アカウントに管理特権が必要です。
次の手順では、WPF Performance Suite の起動方法について説明します。
[スタート] メニューで、[すべてのプログラム]、[Microsoft Windows パフォーマンス ツールキット] の順に選択します。
[WPF Performance Suite] をクリックします。
[ユーザー アカウント制御] ダイアログ ボックスが表示された場合は、[はい] をクリックします。
WPF Performance Suite が起動します。
初めて WPF Performance Suite を起動した場合は、[ツールの追加] ダイアログ ボックスが表示されます。 [ツールの追加] ダイアログ ボックスで、パフォーマンス プロファイリング ツールを追加することができます。 ツールを追加するには、ツールが含まれるアセンブリを選択し、[アセンブリのスキャン] をクリックします。 [ファイル] メニューで [ツールの追加] をクリックすると、いつでも [ツールの追加] ダイアログ ボックスを開くことができます。 [ツールの追加] ダイアログ ボックスを次の図に示します。
[ツールの追加] ダイアログ ボックス
既定では、WPF Performance Suite には次のパフォーマンス プロファイリング ツールが含まれます。
ツール |
説明 |
---|---|
Perforator |
レンダリング動作を分析します。 |
ビジュアル プロファイラー |
ビジュアル ツリーの要素による WPF サービス (レイアウトやイベント処理など) の使用状況をプロファイルします。 |
[Perforator] チェック ボックスと [Visual Profiler] チェック ボックスがオンになっていることを確認し、[OK] をクリックします。
Perforator
Perforator は、WPF アプリケーションのレンダリング動作を分析するためのパフォーマンス プロファイリング ツールです。 Perforator のユーザー インターフェイスには、ダーティな四角形の追加レートやフレーム レートなど、アプリケーションの一部の特定のレンダリング動作を分析できるグラフのセットが表示されます。 WPF は "ダーティな四角形" と呼ばれるレンダリング手法を使用します。これは、画面の変更された部分のみが新しいレンダリング パスに表示されることを意味します。 さらに、Perforator にはいくつかのオプションがあり、レンダリングに関する特定の問題を見つけるために使用できます。 Perforator は、ソフトウェア レンダリング ターゲットや、グラフの期間を制御するスライダーも報告します。 Perforator のユーザー インターフェイスを次の図に示します。
Perforator のユーザー インターフェイス
Perforator の使用
Perforator を使用するには、分析する WPF アプリケーションを起動します。 アプリケーションが起動したら [Perforator] タブをクリックします。[アクション] メニューをクリックし、[プロセスの選択] をクリックします。 [プロセスの選択] ダイアログ ボックスで、分析するアプリケーション プロセスを選択し、[選択] をクリックします。 プロセス名とプロセス ID が [Perforator] タブの上部に表示されます。 分析するレンダリング オプションを選択します。 フレーム レートなどの Perforator データ値には、アプリケーションのレンダリング動作がすぐに反映されます。 例を次の図に示します。
アプリケーションとレンダリング オプションが選択された Perforator
Perforator グラフ
重要なのは、WPF アプリケーションを効率的に表示するため、フレーム レート、ダーティな四角形の追加レート、中間レンダー ターゲットの数は低いままだということです。 Perforator には、これらのレベルを監視するための有用なグラフが多数あります。
次の表に、各グラフで報告されるメトリックを示します。
履歴グラフ |
説明 |
メモ |
---|---|---|
フレーム レート |
アプリケーションが画面にレンダリングするレートを報告します。 |
アニメーションのないアプリケーションの場合、この値は 0 に近くなります。 高パフォーマンスのアプリケーションのアニメーションでは、フレーム レートはモニターのリフレッシュ レート (通常は 60 か 75) に近くなります。 |
ダーティな四角形の追加レート |
各フレームで WPF が更新する必要のある四角形の領域の数を示します。 |
ダーティな四角形は、画面の変更された部分のみが表示されるレンダリング手法を指します。 値が大きい場合は、多くの領域が変更されていることを示します。 これは必ずしも良いか悪いかということではありませんが、アプリケーションの全体的なパフォーマンスにとっては考慮が必要な値です。 |
フレームごとのソフトウェア IRT |
アプリケーションの 1 つのフレームをレンダリングするために必要なソフトウェア中間レンダー ターゲット (IRT) の数を示します。 |
IRT は、WPF との間でデータの割り当てやコピーを行う必要がある、負荷の高いソフトウェア サーフェイスです。 ソフトウェア IRT の負荷は、ハードウェア IRT の負荷よりも大きくなります。 IRT は通常、DrawingBrush、VisualBrush、Visual の Opacity プロパティ、または TileBrush のタイル モードを使用することで発生します。 この数が大きい (たとえば 5 を超える) 場合は、WPF ランタイムがアプリケーションのレンダリングのために大量の作業を実行していることを示します。 ハードウェア アクセラレーションをサポートしているコンピューターでは、この番号は 0 になります。 それ以外の場合、この番号は、一部のシーンが低速のソフトウェア パイプラインを使用してレンダリングされることを示します。 |
フレームごとのハードウェア IRT |
アプリケーションの 1 つのフレームをレンダリングするために必要なハードウェア中間レンダー ターゲット (IRT) の数を示します。 |
IRT は、WPF との間でデータの割り当てやコピーを行う必要がある、負荷の高いハードウェア サーフェイスです。 IRT は通常、DrawingBrush、VisualBrush、Visual の Opacity プロパティ、または TileBrush のタイル モードを使用することで発生します。 この数が大きい (たとえば 5 を超える) 場合は、WPF ランタイムがアプリケーションのレンダリングのために大量の作業を実行していることを示します。 この場合、前に説明した要素を使用するコードのすべての領域を分析する必要があります。 ハードウェア IRT はソフトウェア IRT ほど負荷はかかりません。 |
ビデオ メモリ使用量 |
テクスチャやレンダー ターゲットのための WPF への大量のビデオ メモリ割り当てを追跡します。 このメトリックは、ビデオ ドライバーへのメモリ割り当てや、ピクセル シェーダーと頂点シェーダーのコンパイルや読み込みのためのメモリ割り当ては追跡しません。 |
通常、割り当て可能なテクスチャ メモリの量を超えると、WPF レンダリング ロジックはソフトウェアにフォールバックされます。複数ディスプレイ (マルチモニター) はアプリケーションに必要なビデオ メモリの量に大きく影響します。 |
Perforator レンダリング オプションとレンダリングの最適化
Perforator では、アプリケーションのリアルタイム レンダリング動作に影響する多くのレンダリング オプションを設定することができます。 これらのオプションを設定すると、アプリケーションで問題が発生する可能性があるレンダリング イベントを確認することができます。 これらのオプションは、ユーザー インターフェイスの下部にあります。
Perforator のレンダリング オプションを次の図に示します。
Perforator のレンダリング オプション
一般に、WPF アプリケーションのパフォーマンスを向上させるには、ソフトウェア レンダリングを最小限にして、中間レンダー ターゲットの数を少なくする必要があります。 そのために Perforator を活用する方法について、次のセクションで説明します。
ソフトウェア レンダリングの回避
WPF ハードウェア レンダリング パイプラインはソフトウェア レンダリング パイプラインよりもはるかに高速であるため、ソフトウェアでレンダリングされるアプリケーションのユーザー インターフェイスが少ないほど、アプリケーションのレンダリングは高速になります。 通常、ソフトウェアによる領域のレンダリングの所要時間は、レンダリングされるピクセルの数に比例します。 したがって、ソフトウェア パイプラインを使用して大きな領域をレンダリングする際は注意が必要です。 領域が小さい場合は、それほど心配はいりません。
ソフトウェア レンダリングの問題の検出に役立つ Perforator のオプションを次の表に示します。
オプション |
説明 |
メモ |
---|---|---|
[ソフトウェア レンダリングを紫色で描画する] |
ソフトウェア レンダリング パイプラインを使用してレンダリングされるすべての領域を紫色でレンダリングします。 これには、ソフトウェア レンダー ターゲット、ソフトウェア 3D コンテンツ、プリミティブ単位のソフトウェア フォールバックが含まれます。 |
WPF ハードウェア レンダリング パイプラインは、ソフトウェア レンダリング パイプラインよりもはるかに高速です。 通常、ソフトウェア レンダリングの多用は問題となります。 この動作を引き起こす例として、Brush のタイルの多用や、ビデオ カードのテクスチャ サイズの超過が挙げられます。 |
[ソフトウェアでレンダリングされたビットマップ効果を赤で描画する] |
従来のソフトウェアでレンダリングされたビットマップ効果を赤で描画します。 |
ソフトウェアでレンダリングされる BitmapEffect クラスは低速なため、避ける必要があります。 .NET Framework 3.5 SP1 で導入された、ハードウェアでレンダリングされる Effect クラスを使用してください。 |
[ソフトウェア レンダリングを紫色で描画する] レンダリング オプションを有効にした PhotoDemo のサンプル アプリケーションを次の図に示します。
紫色を使用した PhotoDemo
ダーティ領域の監視
WPF はウィンドウの必要な部分のみを更新するため、更新をいつでも視覚化するのに便利です。 場合によっては、アプリケーションでアニメーションが発生しないこともありますが、領域は引き続き更新されます。 次のオプションは、更新動作を視覚化するのに役立ちます。 WPF がネットワーク経由で新しいビットマップを送信する必要がある場合、特にリモート デスクトップや仮想マシン、および同様のシナリオでは不必要な更新は重大です。 また、不要な更新はラップトップのバッテリ寿命に影響を与えることもあります。
オプション |
説明 |
メモ |
---|---|---|
[ダーティ領域の更新オーバーレイを表示する] |
WPF が画面に実行した各更新が、別の色で示されます。 これにより、アプリケーションで画面のどの領域がいつ再描画されたかどうかを確認することができます。 |
WPF はウィンドウの必要な部分のみを更新するため、更新されるウィンドウの割合をいつでも視覚化するのに便利です。 フレーム レートとダーティな四角形の追加レートが 0 ではないが、アプリケーション内でビジュアルが変更されない場合に、このオプションを使用します。 |
[ダーティ領域のサポートを無効にする] |
変更が加えられたウィンドウ全体をいつでも WPF が再描画します。 |
このオプションは、強制的にウィンドウ全体を更新するのに便利です。 通常は、ウィンドウの変更された部分のみが再描画されます。 このオプションを有効にすると、アプリケーションのレンダリングはかなり遅くなります。 |
[レンダリング前にバック バッファーをクリアする] |
各描画操作の前にアプリケーション ウィンドウをクリアします。 |
このオプションは、[ダーティ領域の更新オーバーレイを表示する] の代わりになるものです。 このオプションでは最新のダーティ領域が効率的に表示されますが、ダーティ領域における変更を時間軸に沿って確認する場合は、ダーティ領域の更新オーバーレイの方が便利です。 |
パフォーマンス低下のその他の原因を検出する
Perforator を使用すると、パフォーマンスに大きく影響する特定の操作を無効にして、それらがアプリケーションのボトルネックの原因になっているかどうかを判断できます。 アプリケーションのフレーム レートを監視し、これらのオプションを個別に選択することにより、3D レンダリングやイメージの再スケーリングなどの操作がレンダリングの問題の原因になっているかどうかを判断できます。 これらのオプションのいずれかを選択したときにフレーム レートが大幅に低下した場合は、操作がアプリケーションのボトルネックとなっている可能性があります。
オプション |
説明 |
メモ |
---|---|---|
[不透明度の効果を無効にする] |
パフォーマンスに大きく影響する可能性のある特定の不透明度の使用を無効にします。 |
一般に、このパフォーマンスの問題を回避するには、Button などの高レベルのオブジェクトではなく、Brush などの低レベルのオブジェクトで不透明度を設定するようにします。 |
[プリミティブ単位のソフトウェア フォールバックを無効にする] |
個々のレンダリング プリミティブに対してソフトウェア フォールバックを無効にします。 ソフトウェアの中間レンダー ターゲットやその他のソフトウェア レンダリングは無効にできません。 |
ほとんどの場合、このオプションは必要ありません。 オフのままにしておいてください。 |
[高品質のイメージの再スケーリングを無効にする] |
大きなサイズから小さなサイズへのイメージの再スケーリングを無効にします。 |
アプリケーションでイメージの再スケーリングの効果を確認することができます。 このオプションをオンにした結果、フレーム レートが大幅に低下した場合は、表示サイズに近いサイズまでイメージをデコードしてください。 |
[3D レンダリングを無効にする] |
すべての 3D レンダリング操作を無効にします。 |
アプリケーションで 3D レンダリング操作の効果を確認することができます。 |
ビジュアル プロファイラー
Visual Profiler は、ビジュアル ツリー内の要素に対応した、レイアウト、レンダリング、アニメーションなどの WPF サービスのパフォーマンス プロファイリング ツールです。 このツールのプロファイリング出力を分析することで、パフォーマンスのボトルネックとなる可能性があるアプリケーションのビジュアル要素を特定できます。
Visual Profiler は、アプリケーションのビジュアル シーンを構築する基本的なビルド ブロックのコンテキストにおけるパフォーマンスの問題を表示します。 これらのビルド ブロックには、Button コントロールや TextBlock コントロールなどの高レベル オブジェクトと、Line 要素や Ellipse 要素などの低レベル オブジェクトが含まれます。 Visual Profiler は、関数名の呼び出しグラフに関するパフォーマンスの問題を記述する代わりに、ビジュアル オブジェクトの表現を使用してこれらの問題を記述します。 これは、Windows SDK ツールの UI Spy が情報を表すのと同様の方法です。 詳細については、「UISpy.exe (UI Spy)」を参照してください。
Visual Profiler の使用
Visual Profiler を使用するには、分析する WPF アプリケーションを起動します。 アプリケーションが起動したら [Visual Profiler] タブをクリックします。[アクション] メニューをクリックし、[プロセスの選択] をクリックします。 [プロセスの選択] ダイアログ ボックスで、分析するアプリケーション プロセスを選択し、[選択] をクリックします。 プロセス名とプロセス ID が [Visual Profiler] タブの上部に表示されます。
WPF のパフォーマンスの問題の範囲を分析するには、基になる WPF サービスのロールとスコープを理解する必要があります。 これらのサービスには、レイアウト、レンダリング、およびアニメーションが含まれます。 Visual Profiler は、WPF サービスがアプリケーション オブジェクト間でどのように割り当てられているかをグラフィック表示します。 たとえば、Visual Profiler では、アプリケーション オブジェクトのビジュアル ツリーを表示するとき、オブジェクトが使用するリソースの相対的な量を表すために、異なる赤の網掛けでオブジェクトをオーバーレイします。 より濃い赤でオーバーレイされたオブジェクトは、薄い赤でオーバーレイされたオブジェクトよりも高い割合でリソースを使用していることを表します。 より重要な点として、Visual Profiler はオブジェクトが消費する特定の WPF リソースの量の内訳を提供します。
Visual Profiler のユーザー インターフェイスを次の図に示します。
Visual Profiler のユーザー インターフェイス
Visual Profiler のユーザー インターフェイスには 8 つの領域があります。
要素ツリーの検索ボックス
ビジュアル要素ツリー
要素の詳細とプレビュー
要素の排他的 CPU 使用状況の詳細
アプリケーションの CPU 使用状況の詳細
キャプチャ データのズーム コントロール
履歴グラフの表示設定
アプリケーションのプレビューとパフォーマンス オーバーレイのオプション
以下のセクションでは、各領域について説明します。
要素ツリーの検索ボックス
[要素ツリー] セクションの検索ボックスでは、アプリケーションの要素ツリー内の要素を検索できます。 検索を実行すると、一致するすべての要素が黄色で強調表示されます。 型または名前で要素を検索することができます。
ビジュアル要素ツリー
[要素ツリー] セクションのツリー コントロールには、アプリケーション内のビジュアル要素の型と名前、サブツリーのサイズ、レイアウトの詳細が表示されます。
ツリー内の要素ラベルの例を次に示します。
Border 'border1' (26) 0.02% (I)/ 0.00 % (E) - .24 ms (I) / 0.00 ms (E)
要素ラベル部分 |
説明 |
---|---|
境界線 |
要素の型 |
'border1' |
要素名 |
(26) |
サブツリーのサイズ。 |
0.02% (I) |
包括的なツリーに対する要素とそのすべての子孫の合計サイズの割合。 |
0.00 (E) |
要素の合計に対する割合 (要素のみ)。 |
.24 ms (I) |
要素とその子孫をレイアウトする時間 (ミリ秒)。 |
0.00 ms (E) |
要素のみをレイアウトする時間 (ミリ秒)。 |
[表示] メニューを使用して、包括的/排他的な割合と時間の情報を表示するかどうかを制御します。
要素を右クリックし、サブツリーを展開または折りたたみます。 ホットパスを展開することもできます。 ホットパスは、サブツリー内で最も CPU を消費する要素を示します。
要素の詳細とプレビュー
[要素情報] セクションは、現在選択されている要素の型と名前 (名前付きの場合) を表示します。 [プレビュー] セクションに要素のプレビューも表示されます。 最上位要素が選択されている場合、プレビューには、アプリケーションのプレビューが表示されます。
要素の排他的 CPU 使用状況の詳細
[要素の排他的 CPU 使用状況] セクションには、選択した要素が使用した排他的 CPU 時間の履歴グラフと詳細が時間の経過と共に表示されます。 たとえば、要素がレイアウトの配置に x%、レイアウトの測定に y%、レンダリングに z% の CPU 時間を費やしたことなどがわかります。
アプリケーションの CPU 使用状況の詳細
[アプリケーションの CPU 使用状況] セクションには、アプリケーション イベントの履歴グラフと詳細が表示されます。 Visual Profiler は、さまざまなアプリケーション イベントをリッスンしてキャプチャします。 アプリケーション イベントは絶対値で一覧表示され、各アプリケーション イベントが時間の経過と共に消費した CPU 時間は履歴グラフに色別に表示されます。 これにより、アプリケーションがレイアウトとレンダリングに要する時間を簡単に確認することができます。
グラフで表されるアプリケーション イベントを次の表に示します。
注意
WPF のメソッド呼び出しに対応するイベントは、メソッド名で表され、その後にかっこで囲まれたクラス名が表示されます。たとえば、Tick (TimeManager) は TimeManager.Tick メソッドを表します。
アプリケーション イベント |
説明 |
---|---|
Unlabeled Time |
WPF で使用された他のアプリケーション イベントに分類されない時間と WPF 外でアプリケーションによって使用されたすべての時間 |
RenderMessageHandler (MediaContext) |
レンダリング パスが開始されたときに発生します。 このイベントが発生すると、タイム マネージャーが他のイベントの間にタイマーを刻みます。 |
Rendering Thread |
レンダリング スレッドでレンダリング指示を実行するときに発生します。 これは、レンダリングにバインドされたアプリケーションを検出するのに便利です。 |
レイアウト |
パスの測定、配置、およびレンダリング中に発生します。 |
UpdateRealizations |
テキスト効果とビットマップ効果の内部ビットマップ表現を更新するときに発生します。 |
Tick (TimeManager) |
アニメーションがタイマーを刻むときに発生します。 このイベントは、アニメーションのレンダリング ハンドラーをトリガーできます。 WPF でオブジェクトをアニメーション化すると、タイム マネージャーがタイムラインに作成された Clock オブジェクトを管理します。 タイム マネージャーは Clock オブジェクトのツリーのルートで、そのツリー内の時間の流れを制御します。 タイム マネージャーは各 WPF アプリケーションに自動的に作成され、アプリケーション開発者には表示されません。 タイム マネージャーは 1 秒間に何度も "タイマーを刻み" ます。 1 秒ごとに刻まれるタイマーの実際の数は、使用可能なシステム リソースによって異なります。 |
AnimatedRenderMessageHandler (MediaContext) |
アニメーションの処理と更新のために発生します。 アニメーションが有効な場合、このハンドラーはアニメーションを処理して更新します。これにより、プロパティが変更され、レンダリングが発生します。 |
Render (MediaContext) |
レンダリング パス中に発生します。 このメソッドは最終的に各要素の OnRender メソッドを呼び出し、すべての要素の OnRender の総コストを把握するのに役立ちます。 このイベントは、Visual Studio プロファイラー (VSP) ファイルの MediaContext.Render メソッドに対応します。 |
キャプチャ データのズーム コントロール
[グラフのオプション] セクションには、キャプチャ データのズーム コントロールが含まれます。 ズーム ウィンドウのハンドルをドラッグすることで、要素の排他的 CPU 使用状況やアプリケーションの CPU 使用状況の履歴グラフのサイズや時間軸を変更することができます。
履歴グラフの表示設定
[グラフのオプション] セクションには、履歴グラフの設定を調整するためのオプション ボタンとスライダーが含まれています。 オプション ボタンを使用して CPU 軸 (縦軸) の動作や、絶対と相対のどちらの重みを表示するかを指定することができます。 スライダーを使用して、グラフに表示される最大値を設定します。
アプリケーションのプレビューとパフォーマンス オーバーレイのオプション
[コントロール オプション] セクションには、次のアクションを実行する 3 つのトグル ボタンが含まれています。
最初のトグル ボタンをクリックして、Visual Profiler のデータ収集の一時停止と開始を切り替えます。
[リアルタイムのプレビュー] トグル ボタンをクリックして、[プレビュー] セクションにアプリケーションのリアルタイムのプレビューを表示します。
[ウィンドウのオーバーレイ] トグル ボタンをクリックし、選択したビジュアル要素を囲む黄色の枠線を追加します。 また、CPU 時間を最も消費する要素には赤のオーバーレイを追加します。 [要素ツリー] セクションの要素にも同じ赤色が使用されます。 CPU 使用率に応じて、赤の濃さが変わります。