Perforator とは
Perforator とは,Windows SDK の bin フォルダに入っているツールで,WPF アプリケーションのフレームレートや,使用しているビデオメモリのサイズを調べたり,どの領域が実際に更新されているかリアルタイムに表示させたりすることができます.
RTM 版に関する追記「Performance Profiling Tools for WPF」にあるように,Windows SDK 6.0 RTM 版では,bin フォルダの wpfperf.exe が Perforator を含むパフォーマンスチューニングツールのランチャとなっています.Perforator.exe は削除され,このランチャ経由で実行するようになっています.
Perforator が使用する Avalon のデバッグコントロールを有効化するには,ドキュメントにあるようにレジストリにある値を書き込んでおく必要があります.
reg add HKLM\SOFTWARE\Microsoft\Avalon.Graphics /v EnableDebugControl /t REG_DWORD /d 1 /f
同様に,無効化するには以下のようにキーを削除します.
reg delete HKLM\SOFTWARE\Microsoft\Avalon.Graphics /v EnableDebugControl /f
レジストリ変更後に起動された WPF プロセスのみがモニタリングできることに注意してください.
残念ながらドキュメントはまだ日本語化されていないので,各オプション,表示値についての簡単な訳を付けておきました.
ソフトウェアレンダリングを避ける
WPF ハードウェアレンダリングパイプラインはソフトウェアレンダリングパイプラインよりも概ね速いので,ソフトウェアで描画されるアプリケーションの UI が少ないほど,アプリケーションは高速に描画されます.典型的にある領域をソフトウェアで描画するのに要する時間は,その領域のピクセル数に比例するので,ソフトウェアパイプラインを使用した大きな領域の描画は慎重にするようにしてください.小さな領域についてはあまり気にすることはありません. ここに,これについて役立つ Perforator のオプションを示します.
- Draw software rendering with purple tint
- ソフトウェアレンダリングパイプラインを使用して描画された領域が紫色に描画されます.これらの領域は,ソフトウェアレンダーターゲット,ソフトウェア3Dコンテンツ,及びプリミティブ単位でのソフトウェア Fallback (注:予備的手段としてのソフトウェア描画) を含みます.
- Num Software Render Targets
- これはウィンドウ全体のレンダーターゲットで,全てソフトウェアで動いているものの個数です.このカウントが 0 以外の場合は,重大なパフォーマンスの問題があることを示しています.しばしばこの問題はマシン設定またはレイヤードウィンドウの使用に関係があります.Microsoft Direct3D が有効になっているか (dxdiag を実行) 確かめ,全てのモニタが 32 bpp になっているか確認し,グラフィックスカードがサポートされていることを確かめてください.
- Num Hardware Render Targets
- この数字はアプリケーションのウィンドウの数にディスプレイアダプタの数をかけたものに等しくなるべきです.これは,可能であればアプリケーションがハードウェアでアクセラレートされることを意味します.
多数の Intermediate Render Targets を避ける
Intermediate Render Targets は,コンテンツをスクリーンに描画できるようにするために WPF が描画しなければならない追加の画像のことです.
- Maximum SW/HW IRTs per Frame
- この数字は,アプリケーションのある 1 フレームを描画するために使用されたソフトウェアまたはハードウェア Intermediate Render Targets の最大値を示します.Intermediate Render Targets は通常 DrawingBrush, VisualBrush, Visual の Opacity, または TileBrush 上の Tile modes を使用することで引き起こされます.もしこの数字が大きい場合は,WPF ランタイムがあなたのアプリケーションを描画するために高コストの処理を多数行っていることを示す指標になります.
有用なパフォーマンス規準値
- Dirty Rect Addition rate
- あなたのアプリケーションでどれぐらい速く (注:頻繁に) 画面更新が引き起こされているかを示します.
- Frame rate
- アプリケーションがスクリーンに描画を行う頻度です.アニメーションを行わないアプリケーションでは,この値は 0 近辺でなるべきです.なぜならダーティーリージョンによる最適化が必要なとき以外は描画を避けるからです.見積もりとしてこの値を使用してください.
- Estimated video memory usage
- この数字は WPF によって直接作成されたビデオメモリー (テクスチャとレンダーターゲット) の,大きなメモリ確保を追跡しています.これは,ドライバによって描画中に確保されたメモリ,ピクセルシェーダ・頂点シェーダのコンパイルとロードによって確保されたメモリ,あるいは頂点バッファ・インデックスバッファのために確保されたメモリは含んでいません.利用可能な量のテクスチャメモリを超過してしまうと,しばしば WPF 描画ロジックはソフトウェアモードになってしまうこと,そして複数のディスプレイ (マルチモニタ) はアプリケーションに必要なビデオメモリの総量を倍加させる効果があることに注意してください.
ダーティーリージョン サポート
Avalon (注:WPF) は必要に応じてウィンドウの一部分のみを更新するため,ある時点でアップデートが行われている領域を可視化できると便利です.これらのオプションはこれを助けてくれます.
- Show dirty-region update overlay
- このオプションは WPF がスクリーンに行うアップデートそれぞれについて,色を変えることで示すようにします.これにより,アプリケーション実行時にどのエリアがいつ再描画されているのか見ることができるようになります.
- Clear Back Buffer Before Rendering
- このオプションにより,各描画処理の前にウィンドウをクリアするようになります.
- Disable Dirty Region Support
- このオプションにより,ウィンドウの変更があった領域のみを再描画するのではなく,WPF は,常に,どんな変更が行われても,ウィンドウ全体を再描画するようになります.これは強制的に画面全体を更新するのに便利ですが,注意が必要です.これを有効化することであなたのアプリケーションで画面更新はより遅く描画されるでしょう.
描画機能の無効化
Perforator によって特定の高コストな処理を無効化することで,それらがアプリケーションのボトルネックになっているかどうか見ることができます.
- Disable Opacity Effects
- 潜在的に高コストになりうる特定の不透明度の使用を禁止します.一般にこのパフォーマンスの問題を回避するためには,上位オブジェクト (Shape,Buttonなど) ではなく,プリミティブ (ブラシ,ペンなど) に不透明度をセットするよう考慮してください(注:シーングラフのあるノードに透明度をセットすると,オフスクリーンに一旦描画されて VisualBrush 経由で合成される模様).
- Disable per-primitive software fallback
- 個々のプリミティブ描画に対するソフトウェアエミュレーションを無効化します.ソフトウェア中間レンダーターゲットとその他のソフトウェア描画は無効化できません.
- Disable high-quality image rescaling
- WPF は大きなイメージが小さなサイズに描画されるとき,綺麗に見せるために (注:DirectXの描画時の縮小ではなく,より高コストな縮小アルゴリズムで) 縮小を行います.この処理は,特に多数の巨大なサイズの画像がスクリーンに縮小表示されるアプリケーションにおいて,高コストになります.このオプションは,パフォーマンスの問題の原因がここにあるかどうか見るために,スケーリングを無効化できます.この問題を避けるには,描画されるサイズに近いサイズに画像を変換することを考慮してください.
- Disable 3D rendering
- 3D 描画処理をオフにします.