デスクトップ ウィンドウ マネージャーのGPU使用率が高い原因
デスクトップ ウィンドウ マネージャー(dwm.exe)がGPU、CPU、メモリを使うのは、画面に見えているすべてのウィンドウを1枚のデスクトップ画像に描き込んでいるからです。そのため負荷は画面の内容に合わせて上下します。リフレッシュレート、ディスプレイの台数、HDR、視覚効果、そして何より、絶えず再描画するアプリです。DWMのGPU使用率が高いのはたいてい別のアプリやディスプレイ設定の症状で、DWM自体の不具合ではありません。直すには、どれがDWMに仕事を送り込んでいるのかを突き止めます。
DWMは止められず、タスク マネージャーで終了しても効果はありません。意味があるのは、自分の環境で計測し、一度に1つだけ変え、グラフィックス ドライバーを最新に保つことです。
デスクトップ ウィンドウ マネージャーの役割
Microsoftのデスクトップ ウィンドウ マネージャーの概要が仕組みを説明しています。ウィンドウはもう画面に直接描画しません。各アプリはビデオメモリ上のオフスクリーンのサーフェスに描画し、DWMがそれらのサーフェスを合成して、ディスプレイに届くデスクトップ画像を作ります。Microsoftは、合成によって実現されるものとして視覚効果、ウィンドウの枠、ウィンドウの切り替えアニメーション、高解像度対応を挙げています。
だからDWMは常に動いています。DwmEnableCompositionのリファレンスによると、この関数はWindows 8以降非推奨で、DWMはもうプログラムから無効にできず、合成の無効化を求める呼び出しは何の効果もありません。Windows 10とWindows 11には、DWMなしで動くサポートされたデスクトップはありません。
タスク マネージャーからdwm.exeを終了しても、負荷の原因になったアプリや設定は残るので、同じ数値が戻ってきます。DWM自身の食欲に見える使用率は、実際にはほかのすべてが描いているものを合成するコストです。
GPU、CPU、メモリが上がる理由
ピクセル、フレーム、合成するサーフェスが増えるほど、合成のコストは上がります。よくある原因は次のとおりです。
- 高いリフレッシュレート。 144 HzではDWMは毎秒60フレームではなく最大144フレームを合成します。その間に画面上で何かが変われば、そのレートで合成し直す必要があります。
- 複数のディスプレイ、または混在した拡大縮小。 ディスプレイはそれぞれ独立した出力で、150%拡大のノートPCのパネルの隣に100%の外部モニターがあると、ウィンドウは画面をまたぐたびに拡大縮小されます。高解像度の外部モニターは、毎フレームに大量のピクセルを追加します。
- HDR。 MicrosoftのHDR設定ページには、バッテリー駆動中にHDRコンテンツを再生するとバッテリー寿命が短くなることがあると書かれています。ノートPCが電源を抜くとHDRを自動でオフにするのはそのためです。デスクトップPCではオンのままなので、これも試す価値のある変数です。
- 透明効果とアニメーション効果。 スタート、タスク バー、一部のウィンドウの背後にあるアクリルのぼかしは、背後の内容が変わるたびに計算し直す必要があります。
- 絶えず再描画するアプリ。 動画を再生中のブラウザー、ボーダーレスやウィンドウモードのゲーム、画面録画や配信ツール、ゲームやチャットのオーバーレイ、動く壁紙、毎フレーム更新するハードウェアモニターは、どれもDWMに新しい内容を送り続けます。これが最もよくある原因で、背景のタブで一時停止した動画やオーバーレイが残っているだけで、「何もしていない」のにDWMが忙しく見えるのもこのためです。
- グラフィックス ドライバー。 DWMの処理はGPUドライバーを経由するので、ドライバーのバグはDWMの名前で現れます。Intelはサポート記事で1つの事例を記録しています。第6世代から第10世代のIntelプロセッサーでのdwm.exeのメモリ増加で、Windows 10用ドライバー27.20.100.8587以降で発生し、約30 MBから始まってシステムがクラッシュしかねないところまで蓄積していきました。Intelの解決策はWindows DCHドライバー30.0.101.1191以降で、Windows Updateが別のドライバーを入れていた場合はクリーンインストールをしたうえで導入します。古いIntelドライバーを使っていて、DWMのメモリが増える一方なら、まずこれを確認してください。
DWMのメモリには、合成するサーフェスが含まれます。ウィンドウが多いほど、ディスプレイが大きいほど、拡大率が高いほどサーフェスは増えるので、マルチモニター環境はノートPCのパネル1枚より目に見えて多く使います。同じウィンドウを開いたまま何時間も増え続けるのは、それとは別の話です。
まずタスク マネージャーで計測する
Ctrl + Shift + Escを押します。[プロセス]タブで[デスクトップ ウィンドウ マネージャー]を探します。GPU列がなければ、どれかの列見出しを右クリックして[GPU]と[GPU エンジン]をオンにします。
この2列はセットで読みます。Microsoftのタスク マネージャーのGPUに関する記事によると、プロセスのGPU値はすべてのGPUの中で最も忙しいエンジンの使用率で、[GPU エンジン]列はそれがどのGPUのどのエンジンかを示します(たとえばGPU 0 - 3D)。2つのプロセスがどちらも高い値を示していても、使っているエンジンが違うことがあります。Video Decodeエンジンを使う動画アプリと3DのDWMは、同じものを奪い合ってはいません。
[パフォーマンス]タブでは、左側のパネルで各GPUを選ぶと、エンジンごとの使用状況と専用メモリ、共有メモリの推移が見られます。[詳細]タブでは、見出しを右クリックして[列の選択]を選び、dwm.exeのGPU使用率や専用GPUメモリ、共有GPUメモリを追加します。同じ記事は、共有メモリが複数のプロセスで重複して数えられることがあり、プロセスごとの合計がGPUの実際の使用量を超える場合があると注意しています。GPU列にはWDDM 2.0以降のドライバーが必要です。
何かを変える前に3つを書き留めておきます。DWMがどのエンジンを使っているか、数値が自分の操作に連動しているか、メモリが安定しているか増え続けているかです。
1つずつ変えて原因を切り分ける
1つ変えて1分ほどDWMを見て、何も動かなければ元に戻します。
- アプリを1つずつ閉じる。 動きのあるものから始めます。ブラウザーの動画、ゲーム、録画や配信ソフト、ゲームランチャーのオーバーレイ、チャットやGPUのユーティリティ、動く壁紙です。最小化だけでは足りないことがあり、バックグラウンドでもフレームを出し続けるアプリがあります。あるアプリを閉じてDWMが下がれば、原因はそのアプリで、見るべきはそのアプリ自身の設定(ハードウェアアクセラレーション、フレームレート制限、オーバーレイのオンオフ)です。
- ディスプレイを1台外す。 モニターを1台外してDWMが落ち着くなら、増えた解像度、リフレッシュレート、または混在した拡大縮小が負荷です。終わったら接続し直してください。これはテストであって対処ではありません。
- リフレッシュレートを下げる。 Microsoftのリフレッシュレートのガイドでは、設定 › システム › ディスプレイ › 詳細表示 › リフレッシュ レートの選択 を使います。アスタリスク付きのレートは解像度も変わります。対応ディスプレイでは同じページに[動的リフレッシュ レート]があり、必要なときだけレートを上げます。Microsoftは低いレートのほうがバッテリーを節約できるとしています。比較したら元に戻します。
- 透明効果とアニメーションをオフにする。 Microsoftの視覚効果の手順では 設定 › アクセシビリティ › 視覚効果 を開き、[透明効果]と[アニメーション効果]をオフにできます。サーフェスは不透明になり、ウィンドウのアニメーションも止まります。どちらのスイッチも同じ場所でオンに戻せます。
- テストとしてHDRをオフにする。 設定 › システム › ディスプレイ で、ディスプレイが複数あるなら上部でHDRのディスプレイを選び、HDRをオフにして比べます。
確認しておきたいグラフィックス設定
Windowsには、フレームがDWMに届く仕組みを変えるグラフィックスのオプションが2つあります。どちらも 設定 › システム › ディスプレイ › グラフィックス にあります。
ウィンドウ ゲームの最適化。 Microsoftのウィンドウ ゲームのページによると、[既定の設定]にあるこのスイッチは、ウィンドウモードとフチなしウィンドウモードで動く互換性のあるDirectX 10とDirectX 11のゲームを、古いblt表示モデルからflipモデルに切り替え、フレームの遅延を減らします。そうしたゲームの実行中にDWMが忙しいなら、オンにしてゲームを再起動してみてください。ゲームに排他的フルスクリーンがあれば、それに切り替えるのも比較になります。
ハードウェア アクセラレータによる GPU スケジューリング。 MicrosoftのDirectXチームの説明では、これはGPUのスケジューリング作業の多くをWindowsからGPU自身に移すもので、GPUとそのWDDM 2.7以降のドライバーの両方が対応している場合にだけグラフィックス設定に表示されます。DWMが合成する量は減らないので、A/Bテストとして扱ってください。切り替えて、Windowsに求められたら再起動し、同じ作業を繰り返して、自分のハードウェアで調子のよいほうを残します。
グラフィックス ドライバーを更新またはロールバックする
Microsoftのドライバーのガイドは、まずWindows Updateを使い、ドライバーをダウンロードするならメーカーの公式サイトからだけにするよう勧めています。グラフィックスなら、PCメーカーのサポートページ(ノートPCはカスタマイズされたドライバーを使うことが多い)か、Intel、AMD、NVIDIAから直接です。デバイス マネージャーで[ディスプレイ アダプター]を展開すると、搭載しているGPUがわかります。
ドライバーの更新直後からDWMの問題が始まったなら、ロールバックします。デバイス マネージャーでディスプレイ アダプターを右クリックし、[プロパティ]を選び、[ドライバー]タブを開いて[ドライバーのロールバック]を選びます。求められたら再起動します。
画面がカクつく、真っ暗になる、固まるけれどWindows自体は反応しているときは、Win + Ctrl + Shift + Bを押します。Microsoftのキーボード ショートカットの一覧では、画面が空白または黒いときにデバイスを復帰させるものと説明されています。固まった表示のためのもので、リークし続けるドライバーを直すものではありません。
やってはいけないこと
dwm.exeを終了しない。 デスクトップを描いているWindowsの一部で、負荷の原因は別のところにあります。- DWMを無効にしようとしない。 サービス、レジストリ、「debloat」スクリプト、合成をオフにできると称するツールのどれを使ってもです。Windows 8以降は無効にできず、こうした調整はよくて何も起きず、悪ければデスクトップを復旧しにくい状態に陥らせます。
- システムファイルの名前を変えたり置き換えたりしない。
dwm.exeやdwmcore.dllなどです。 - フォーラムで見かけたGPU優先度やスケジューリングのレジストリ調整を使わない。 元に戻せる設定のスイッチを使ってください。
- 出どころのわからないサイトのドライバークリーナーを実行しない。 Intelの記事のようにベンダーがクリーンインストールを求める場合は、そのベンダー自身の手順に従います。
Moleでできること
Mole for Windowsは、ディスプレイ、HDR、グラフィックス、ドライバーの設定を変えず、DWMにも触れません。[ステータス]ページにはCPU、メモリ、ディスク、ネットワークの動きに加えて、GPUのタイルがあり、最も忙しいエンジンの使用率の推移、ドライバーが報告する場合はビデオメモリ、温度を公開しているドライバーではGPU温度を表示します。プロセス一覧は所有するアプリごとにまとめて各アプリのCPUとメモリを表示しますが、プロセスごとのGPU列はないので、どのプロセスがGPUを動かしているかはタスク マネージャーの[GPU]と[GPU エンジン]列で確認してください。それ以外はヘルプのステータスの項目にあります。
役に立つやり方として、アプリを1つずつ閉じながらMoleのGPUタイルを見ていれば、下がったところでどのアプリがDWMに仕事を送っていたかがわかります。上がるのがCPUならWindowsのCPU使用率が高いときを、メモリならWindowsのメモリ使用率が高いときを、ノートPCが熱くもなるならWindowsノートパソコンの過熱を見てください。
よくある質問
dwm.exeはウイルスですか?
本物のデスクトップ ウィンドウ マネージャーはWindowsの一部で、見えているすべてのウィンドウを合成しています。使用率が高いのはほかのアプリが描いているものを反映しているだけで、マルウェアではありません。
デスクトップ ウィンドウ マネージャーを無効にできますか?
できません。Windows 8以降、DWMの合成はオフにできず、プロセスを終了してもWindowsがまた起動するだけです。DWMを忙しくさせているアプリやディスプレイ設定を見つけて、負荷を減らしてください。
何も開いていないのにデスクトップ ウィンドウ マネージャーのGPU使用率が高いのはなぜですか?
たいてい何かがまだ描画しています。一時停止した動画のタブ、オーバーレイ、動く壁紙、モニタリングのウィジェットなどです。高いリフレッシュレートや複数のディスプレイはベースラインを押し上げます。それらを1つずつ閉じながらGPU列を見てください。
dwm.exeのメモリが増え続けるのはなぜですか?
ウィンドウやディスプレイが増えればある程度増えるのは普通です。同じウィンドウを開いたまま何時間も増え続けるなら、ドライバーの問題が疑われます。Intelはそうしたdwm.exeのリークを1件記録し、ドライバー30.0.101.1191で修正しました。