WinUI 3 のパフォーマンスの最適化

このトピックでは、Windows Performance Toolkit のパフォーマンス監視ツールを使用して、WinUI アプリケーションの詳細なパフォーマンス プロファイルを生成する方法について説明します。

Windows パフォーマンス レコーダーを使用して WinUI アプリを監視するにはどうすればよいですか?

Windows Performance Recorder (WPR) は、組み込みのプロファイルに基づいて、システムとアプリケーションの動作およびリソース使用状況に関する詳細な Windows イベント トレーシング (ETW) の記録を作成するために使用できます。 これらの ETW 記録を Windows Performance Analyzer (WPA) で処理すると、一連のグラフとテーブルが生成され、CPU 使用率、電源の問題、システムまたはアプリケーションのパフォーマンスの低下、その他のパフォーマンスの問題を簡単に確認したり、詳しく分析したりできます。

注

WPR には GUI とコマンド ラインの両方のバージョンがありますが、このトピックでは GUI バージョンについてのみ説明します (両方のバージョンの詳細については、「WPR の概要」を参照してください)。

WPR プロファイル

アプリのさまざまな側面と動作に関する情報を収集するには、WPR プロファイルが使用されます。

次の図は、Windows Performance Recorder ウィンドウで、"CPU 使用率" プロファイル (システム上の CPU ごとの CPU 使用率) と "XAML アクティビティ" プロファイル (WinUI などの XAML 関連のプロバイダーからのイベント) が選択されているところを示しています。

 CPU 使用率と XAML アクティビティ プロファイルが選択されたWindows パフォーマンス レコーダーのスクリーンショット。

WinUI アプリでWindows Performance Analyzerを使用するにはどうすればよいですか?

WinUI は、保持モードの宣言型 API です。アプリは UIElement のツリーを記述し、WinUI がレイアウトを実行してレンダリングします。 この処理は、UI スレッド上で "フレーム" と呼ばれるバッチ単位で行われます。これは短時間で完了する必要があり、ディスプレイの 1 回のリフレッシュ間隔内に収まることが理想的です。 フレームの実行時間が長くなると、ディスプレイの更新に遅延が生じるだけでなく、UI スレッドでの入力の処理も妨げられます。 低速フレームは、応答性の問題を引き起こす唯一の原因というわけではありませんが、最もよくある原因の 1 つです。

"XAML フレーム分析" プラグインをインストールする

WinUI は、各フレームの開始と停止を追跡する ETW イベントをログに記録します (以下の WPA の "汎用イベント" テーブルのスクリーンショットに示されています)。 ただし、各フレームの期間を手動で計算する必要があるため、遅いフレームの発生を特定することは困難です。

Windows Performance Analyzer で、

この問題に対処するために、新しい "XAML フレーム分析" テーブル プラグインが Windows Assessment Toolkit (ADK) 10.1.26100.1 以降に含まれています。 このテーブルは、各フレームの継続時間を計算して (時間のかかる他の操作と共に) 表示します。

注

"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" をテキスト エディターで開きます。DLL のリストに perf_xaml.dll を追加し、ファイルを保存して閉じます。 WPA を再起動すると、[システム アクティビティ] セクションの下部に "XAML フレーム分析" グラフが表示されます。

システム アクティビティ セクションの下部にある XAML フレーム分析テーブルを示すWindows Performance Analyzerのスクリーンショット。

"XAML フレーム分析" プラグインを使用する

XAML フレーム分析は、次の 2 つのビューをサポートしています (どちらのビューでも同じ列が表示されます)。

  • [注意が必要な Xaml フレーム] (既定) - 応答性の問題を引き起こす可能性が高いフレームを特定するヒューリスティックに基づいて WinUI フレームを表示します。 これらは、WinUI の初期化、フレーム ナビゲーション、ポップアップ表示などの操作で開始され、次のフレームの最後で停止する領域に対応します。 このようなシナリオは通常、UIElement ツリーに対する広範な変更を伴い、パフォーマンスの問題の影響を最も受けやすいものです。
  • "すべての Xaml 情報" - トレースで見つかったすべてのプロセスからのすべての WinUI フレームを表示します。 フレームやレイアウト パスなどの操作については、プラグインは開始イベントと停止イベントに基づいて、自動的に継続時間を計算して表示します。

次のスクリーンショットでは、XAML フレーム分析ビューを切り替える方法が強調表示されています。

Windows Performance Analyzer の

どちらの XAML フレーム分析ビューにも、次の列が含まれています。

タイトル 価値
プロセス プロセス名と ID
スレッド ID スレッド ID
タイプ 行に対応するイベントを表します。 指定できる値は、次のとおりです。
  • WXM::InitializeForCurrentThread - WindowsXamlManager.InitializeForCurrentThread の呼び出し。 スレッドで WinUI を初期化します。
  • DWXS::Initialize - DesktopWindowXamlSource.Initialize の呼び出し。 WinUI アイランドを初期化します。
  • Frame - UI スレッド上のフレーム。 レイアウトを実行し、前のフレーム以降のツリーに対する変更をレンダリングします。
  • Create graphics device - WinUI 用の D3D デバイスと D2D デバイスを作成します。 バックグラウンド スレッドで実行されます。
  • UpdateLayout - UI スレッド上のレイアウト パス。 フレームの一部として実行されますが、UIElement.UpdateLayout を通じてアプリによってトリガーされることもあります。
  • Frame::Navigating - WinUI から Frame.Navigating イベントが発生しました。
  • Frame::Navigated - WinUI から Frame.Navigated イベントが発生しました。
  • Hwnd Focus - アクティブな hwnd が変更されました。
  • Region of Interest - プラグインによって計算された、注意が必要なシナリオの領域。 WinUI の初期化、フレーム ナビゲーション、メニューの表示などのイベントの後に開始されます。 次のフレームの最後で停止します。
興味深い 行が興味深いと見なされるかどうか。 [興味深い Xaml フレーム] ビューには、興味深い行だけが表示されます。
期間 (ミリ秒) 行の持続時間。 開始イベントと停止イベントから計算されます。
重み (ミリ秒) 継続時間に対応する実際の CPU 実行時間。
開始 (秒) 開始イベントの時間。
停止 (秒) 停止イベントの時刻。

列を種類や期間で並べ替えると、トレース内で最もコストが高く、最も継続時間が長いフレームなど、潜在的な問題を特定するために役立ちます。 また、特定の行にドリルダウンして、コストの高い操作を確認し、最適化の可能性を探ることもできます。

Windows Performance Analyzerのスクリーンショットが表示され、すべてのXAML情報テーブルが期間(ミリ秒)で並べ替えられています。