# 桌面窗口管理器 GPU 占用高：原因和解决办法

桌面窗口管理器（`dwm.exe`）会占用 GPU、CPU 和内存，是因为屏幕上看到的每一个窗口都要由它合成成一张完整的桌面画面，所以它的负载跟着屏幕上的内容起落，刷新率、显示器数量、HDR、视觉效果，最主要的还是那些不停重绘的应用。DWM 的 GPU 占用高，大多是别的应用或某项显示设置的症状，不是 DWM 自己出了故障，要做的是找出到底是谁在喂它。

DWM 关不掉，在任务管理器里结束它也没用，真正有用的是对着自己的配置把它测一遍，一次只改一处，同时让显卡驱动保持最新。

## 桌面窗口管理器在做什么

微软的[桌面窗口管理器概述](https://learn.microsoft.com/en-us/windows/win32/dwm/dwm-overview)讲了它的工作方式，窗口不再直接画到屏幕上，每个应用先画进显存里的一块离屏表面，再由 DWM 把这些表面合成成最终送到显示器的桌面画面，微软列出的视觉效果、窗口边框、窗口切换动画和高分辨率支持，都是靠这套合成机制实现的。

所以 DWM 是常驻的，[DwmEnableComposition 的参考文档](https://learn.microsoft.com/en-us/windows/win32/api/dwmapi/nf-dwmapi-dwmenablecomposition)写明这个函数从 Windows 8 起已经弃用，DWM 也不能再通过程序关闭，调用它要求关掉合成不会有任何效果，在 Windows 10 和 Windows 11 上没有一种受支持的桌面可以不用它。

在任务管理器里结束 `dwm.exe`，造成负载的应用和设置都还在，数字很快又会回来，看起来像是 DWM 自己胃口大的占用，其实是它在替其他程序合成画面付出的代价。

## 为什么 GPU、CPU 和内存会上去

要合成的像素越多、帧越多、表面越多，合成的开销就越大，常见原因有这些：

- **高刷新率。** 144 Hz 下 DWM 每秒最多要合成 144 帧而不是 60 帧，这段时间里屏幕上有任何变化，都得按这个频率重新合成。
- **多台显示器，或缩放比例不一致。** 每台显示器都是独立的输出，笔记本屏幕用 150% 缩放、旁边的外接显示器用 100%，窗口在两块屏幕之间移动时就要重新缩放，一台高分辨率外接显示器也会给每一帧多加一大批像素。
- **HDR。** 微软的 [HDR 设置页面](https://support.microsoft.com/en-us/windows/hardware/display-graphics/hdr-settings-in-windows)提到用电池播放 HDR 内容会缩短续航，所以笔记本拔掉电源时会自动关闭 HDR，台式机上它一直开着，也是一个值得测一测的变量。
- **透明和动画效果。** 「开始」菜单、任务栏和部分窗口背后的亚克力模糊，在背后内容变化时都要重新计算。
- **不停重绘的应用。** 浏览器在播视频，游戏在无边框或窗口模式下运行，录屏或直播软件，游戏或聊天软件的叠加层，动态壁纸，还有每一帧都刷新的硬件监控工具，都会源源不断地给 DWM 送新内容，这是最常见的原因，也是为什么你明明「什么都没干」，后台标签页里有个暂停的视频或某个叠加层还开着，DWM 看起来却一直在忙。
- **显卡驱动。** DWM 的工作都要经过 GPU 驱动，驱动的 bug 就会记在 DWM 头上，Intel 在一篇支持文章里记录过一个案例，[第 6 代到第 10 代 Intel 处理器上的 dwm.exe 内存增长](https://www.intel.com/content/www/us/en/support/articles/000058381/graphics.html)，出现在 Windows 10 驱动 27.20.100.8587 及更新版本上，从 30 MB 左右开始一路累积，直到系统可能崩溃，Intel 给的解决办法是装 Windows DCH 驱动 30.0.101.1191 或更新版本，如果 Windows 更新装过别的版本，要先做一次驱动的干净安装，如果你的 Intel 驱动比较旧，DWM 内存又只涨不降，先查这一条。

DWM 的内存里包含它要合成的那些表面，窗口越多、显示器越大、缩放越高，表面就越多，所以多显示器的配置会明显比单块笔记本屏幕用得多，这是正常的，开着同样几个窗口、几个小时里内存一直稳定上涨，就不正常了。

## 先在任务管理器里测一测

按 `Ctrl + Shift + Esc`，在「进程」选项卡里找到「桌面窗口管理器」，如果没有 GPU 列，右键任意列标题，勾选「GPU」和「GPU 引擎」。

这两列要放在一起看，微软的[任务管理器 GPU 文章](https://devblogs.microsoft.com/directx/gpus-in-the-task-manager/)解释过，一个进程的 GPU 数字是它在所有 GPU 上最忙的那个引擎的利用率，「GPU 引擎」列告诉你是哪块 GPU 的哪个引擎，比如 `GPU 0 - 3D`，两个进程可能都显示很高的数字，用的却是不同的引擎，视频应用跑在 Video Decode 引擎上、DWM 跑在 3D 引擎上，两者并没有在抢同一样东西。

在「性能」选项卡里，点左侧的每一块 GPU，能看到它各个引擎的曲线，以及专用和共享内存随时间的变化，在「详细信息」选项卡里，右键列标题，选「选择列」，给 `dwm.exe` 加上 GPU 利用率或专用、共享 GPU 内存，同一篇文章也提醒，共享内存可能会被算到不止一个进程名下，所以各进程加起来可能比 GPU 实际用的还多，GPU 列需要 WDDM 2.0 或更新的驱动才会出现。

动手改之前先记下三件事，DWM 用的是哪个引擎，数字是不是跟着你正在做的事情变化，内存是平稳的还是在往上爬。

## 一次只改一处，找出原因

改一处，看一分钟 DWM，没变化就改回去。

1. **一个一个关应用。** 先从会动的东西开始，浏览器里的视频、游戏、录屏或直播软件、游戏启动器的叠加层、聊天和显卡工具、动态壁纸，只最小化不一定够，有些应用在后台还会继续输出画面，关掉某个应用后 DWM 降下来了，原因就是它，接下来该看它自己的设置，硬件加速、帧率限制、叠加层开关这些。
2. **拔掉一台显示器。** 拔掉一台后 DWM 平稳了，负载就来自多出来的分辨率、刷新率或不一致的缩放，测完再接回去，这是测试，不是解决办法。
3. **降低刷新率。** 微软的[刷新率指南](https://support.microsoft.com/en-us/windows/change-your-display-refresh-rate-in-windows-c8ea729e-0678-015c-c415-f806f04aae5a)走的是 设置 › 系统 › 显示 › 高级显示 › 选择刷新率，带星号的刷新率会同时改变分辨率，支持的显示器在同一页面还有「动态刷新率」，只在需要时才把刷新率调高，微软提到较低的刷新率更省电，测完切回去对比。
4. **关掉透明和动画。** 微软的[视觉效果步骤](https://support.microsoft.com/en-us/accessibility/windows/make-it-easier-to-focus-on-tasks)是进入 设置 › 辅助功能 › 视觉效果，在这里可以关掉「透明度效果」和「动画效果」，界面会变成实色，窗口也不再有动画，两个开关都可以按同样的路径打开。
5. **临时关掉 HDR 测一测。** 在 设置 › 系统 › 显示 里，有多台显示器的话先在顶部选中 HDR 那台，关掉 HDR 再对比。

## 值得检查的图形设置

Windows 有两个图形选项会改变画面送到 DWM 的方式，都在 设置 › 系统 › 显示 › 图形 里。

**窗口化游戏优化。** 微软的[窗口化游戏页面](https://support.microsoft.com/en-us/windows/optimizations-for-windowed-games-in-windows-11-3f006843-2c7e-4ed0-9a5e-f9389e535952)说，「默认设置」下的这个开关会把窗口和无边框窗口模式下兼容的 DirectX 10、DirectX 11 游戏，从旧的 blt 呈现模型切到 flip 模型，降低帧延迟，如果这类游戏运行时 DWM 很忙，可以打开它再重启游戏试试，游戏有独占全屏选项的话，切过去也是一种对比。

**硬件加速 GPU 计划。** 微软的 [DirectX 团队解释过](https://devblogs.microsoft.com/directx/hardware-accelerated-gpu-scheduling/)，这个选项把 GPU 的大部分调度工作从 Windows 挪到 GPU 自己身上，只有 GPU 和它的 WDDM 2.7 或更新驱动都支持时，图形设置里才会出现，它不会减少 DWM 要合成的内容，所以当成一次 A/B 测试就好，切换后按 Windows 提示重启，重复同样的操作，保留在你的硬件上表现更好的那个状态。

## 更新或回退显卡驱动

微软的[驱动指南](https://support.microsoft.com/en-us/windows/update-drivers-through-device-manager-in-windows-ec62f46c-ff14-c91d-eead-d7126dc1f7b6)建议先用 Windows 更新，要自己下载驱动的话，只从制造商的官方网站下，对显卡来说，就是电脑厂商的支持页面（笔记本常用定制驱动），或者直接去 Intel、AMD、NVIDIA 的官网，在设备管理器里展开「显示适配器」，能看到你有哪几块 GPU。

如果 DWM 的问题是更新驱动后才开始的，就回退，在设备管理器里右键显示适配器，选「属性」，打开「驱动程序」选项卡，点「回退驱动程序」，提示重启就重启。

屏幕卡顿、黑屏或冻住，但 Windows 本身还有反应时，按 `Win + Ctrl + Shift + B`，微软的[键盘快捷方式列表](https://support.microsoft.com/en-us/windows/keyboard-shortcuts-in-windows-dcc61a57-8ff0-cffe-9796-cb9706c75eec)说它用于在屏幕空白或黑屏时唤醒设备，它对付的是卡住的显示，不能修好一个一直在泄漏的驱动。

## 不要这样做

- **不要结束 `dwm.exe`。** 它是 Windows 里负责画桌面的那部分，负载的根源在别处。
- **不要试图禁用 DWM**，不管是通过服务、注册表、「精简」脚本，还是号称能关掉合成的工具，从 Windows 8 起它就关不掉了，这类调整好的时候什么用都没有，坏的时候会让桌面停在一个很难恢复的状态。
- **不要重命名或替换系统文件**，比如 `dwm.exe` 或 `dwmcore.dll`。
- **不要照搬论坛上调 GPU 优先级或调度的注册表改法。** 用设置里的开关，随时能改回去。
- **不要运行来路不明的驱动清理工具。** 厂商要求干净安装时，比如 Intel 那篇文章，就按厂商自己的说明做。

## Mole 能帮上什么

Mole for Windows 不改显示、HDR、图形或驱动设置，也不碰 DWM，它的「状态」页显示 CPU、内存、磁盘和网络活动，还有一张 GPU 卡片，显示最忙那个引擎的占用曲线，驱动报告显存时显示显存，驱动提供温度时显示 GPU 温度，进程列表按所属应用分组，显示每个应用的 CPU 和内存，没有按进程的 GPU 列，想看是哪个进程在拉高 GPU，用任务管理器的「GPU」和「GPU 引擎」列，其余内容见[帮助里的状态部分](/zh/windows/help)。

有个好用的办法，一边一个个关应用，一边看 Mole 的 GPU 卡片，在哪一步降下来，就知道是哪个应用在喂 DWM，如果涨的是 CPU，看 [Windows CPU 占用高](/zh/windows/blog/windows-high-cpu-usage)，内存的话看 [Windows 内存占用高](/zh/windows/blog/windows-high-memory-usage)，笔记本还发烫的话，看 [Windows 笔记本过热](/zh/windows/blog/windows-laptop-overheating)。

## 常见问题

### dwm.exe 是病毒吗？

真正的桌面窗口管理器是 Windows 的一部分，负责合成你看到的每一个窗口，它的占用高反映的是其他应用在画什么，不是恶意软件。

### 能禁用桌面窗口管理器吗？

不能，从 Windows 8 起 DWM 合成就关不掉了，结束这个进程只会让 Windows 再把它启动起来，要降低它的负载，就去找让它一直忙着的那个应用或显示设置。

### 什么都没开，桌面窗口管理器的 GPU 占用为什么还这么高？

通常还有东西在画，一个暂停的视频标签页、一个叠加层、一张动态壁纸，或者一个监控小组件，高刷新率和多台显示器也会抬高基线，把这些一个个关掉，同时盯着 GPU 列。

### dwm.exe 的内存为什么一直涨？

窗口和显示器变多时涨一些是正常的，开着同样的窗口、内存却连涨几个小时，指向的是驱动问题，Intel 记录过一个这样的 dwm.exe 泄漏，在驱动 30.0.101.1191 里修好了。


Canonical: https://mole.fit/zh/windows/blog/desktop-window-manager-high-gpu
