このガイドでは、Windows アプリケーションが電力を消費する方法を改善する方法について説明し、デバイスの全体的なパフォーマンスとバッテリ寿命の向上に役立つ原則を提供します。
電力消費量を改善するための最も基本的な原則は、アプリがバックグラウンドにある間は、次のことがないようにすることです。
- システム リソースを使用する
- タイマーを介して CPU をスリープ解除する
- vsync イベントを待機して CPU をスリープ解除します。
"バックグラウンド" とは、アプリがユーザーに表示されず、聞こえないことを意味します。 バックグラウンドで CPU をスリープ解除したり、システム リソースを利用したりする理由はほとんどありません (ある場合)。 アプリがこれらのイベントをトリガーしているかどうかを確認し、原因に対処すると、アプリの電力消費量、バッテリ寿命が大幅に向上し、アプリを 使用する顧客による二酸化炭素排出量を削減できます。
アプリが使用されていない間に不要な作業を行うために CPU がウェイクアップされていないことを確認するには、 Windows Performance Analyzer (WPA) を使用してトレースをキャプチャして分析できます。 以下にその方法を実行する手順を説明します。
トレースをキャプチャし、不要な作業を確認する
トレースをキャプチャする前に、アプリを実行するときに正しい条件を設定して、電力を消費する可能性のある不要な作業が実行されているかどうかを分析することが重要です。 また、さまざまな条件下でアプリをテストするために、複数のトレースを実行することもできます。
セットアップ
タスク マネージャーを開き、CPU 使用率が 5%未満であることを確認して、テスト デバイスをアイドル状態にします。 これにより、測定の干渉を最小限に抑え、妥当なサイズ トレースを提供します。
アプリを起動し、一般的に使用されることが予想されるビューに移動します。
アプリを最小限に抑えます。 *アプリウィンドウが他のウィンドウの背後で完全に隠れている(ビューからブロックされる)間、およびアプリがフォアグラウンドにある場合は、ユーザーによる操作が一切行われなかった後に、不要な作業がアプリによって開始されないようにするために、次の手順を繰り返す必要があります。
バックグラウンドでの CPU 使用率の測定と評価
管理者モードでコマンド ライン (PowerShell またはコマンド プロンプト) を開きます。 (管理者モードで実行しない場合は、"ポリシーを有効にしてシステムのパフォーマンスをプロファイルできませんでした" 0xc5585011というエラー コードが表示されることがあります)。
コマンドを入力します。
wpr -start power -filemodeデバイスを 5 分間アイドル状態のままにします。
コマンドを入力します。
wpr -stop idletrace.etlWindows Performance Analyzer (WPA) を使用してトレースを開くには、次のコマンドを入力します。
wpa.exe idletrace.etl計算>CPU 使用率 (正確) グラフを開きます。
プロセスに移動し (または、アプリに関連するすべてのプロセスのマルチプロセス モデルがある場合)、 Cswitch の数 "CPU ごとの使用率" を評価します。 アプリがバックグラウンドにある間は、可能な限り 0 に近い値が理想的です。 スタックを見ると、リソースが使用されている場所とその改善方法を見つけるのに最適な方法です。
"新しいスレッド スタック" を追加して過剰なスリープ解除を探して、スレッドが発生したスタックを確認します。
計算>CPU 使用率 (サンプリング) グラフを開きます。 コード内時間の実行に費やされている場所を評価して、CPU 使用率の問題を追跡します。
バックグラウンドで待機している vsync の測定と評価
注
このより高度なシナリオを調査する前に、前のセクションの基本的な CPU 使用率に注目してください。
管理者モードで コマンド ライン (PowerShell またはコマンド プロンプト) を開きます。
コマンドを入力します。
wpr -start gpu -filemodeデバイスを 5 分間アイドル状態のままにします。
コマンドを入力します。
wpr -stop gputrace.etlWindows Performance Analyzer (WPA) を使用してトレースを開くには、次のコマンドを入力します。
wpa.exe gputrace.etlSystem Activity>Generic イベント グラフを開きます。
- "Microsoft-Windows-Dxgkrnl" イベントにフィルターをかけます。
- [プロセス] 列を 2 番目の列にドラッグします。
- WaitForVsync を呼び出しているかどうかを確認します。 たとえば、IDXGIOutput::WaitForVBlank (dxgi.h) などの API を
WaitForVerticalBlankEventInternalイベントを通じて使用します。
詳細については、 Windows パフォーマンス アナライザーを使用したモダン スタンバイの問題の分析に関する記事を参照してください。
その他のリソース
Windows developer