# Windows 上的 DirectX 着色器缓存可以删吗

DirectX 着色器缓存存的是 Windows 编译好的着色器，也就是显卡运行的小程序，这样游戏和 App 就不用再编译一遍。它可以放心删，Windows 自己的清理工具里就有这一项，代价是下次启动要重建，游戏可能加载变慢或者卡顿一阵子，所以确实占了不少空间、或者怀疑它坏了时再清，不要当成日常维护。

## 它在哪里

系统缓存在 `%LOCALAPPDATA%\D3DSCache`，每份缓存一个文件夹，显卡驱动和游戏还有各自的：

| 用户文件夹下的路径 | 属于谁 |
| --- | --- |
| `AppData\Local\D3DSCache` | Windows DirectX |
| `AppData\Local\Microsoft\DirectX Shader Cache` | Windows DirectX 管线缓存 |
| `AppData\Local\NVIDIA\DXCache`、`AppData\Local\NVIDIA\GLCache` | NVIDIA |
| `AppData\LocalLow\NVIDIA\PerDriverVersion\DXCache` | NVIDIA |
| `AppData\Local\AMD\DXCache`、`AppData\Local\AMD\VkCache` | AMD |
| `AppData\Local\Intel\ShaderCache`、`AppData\LocalLow\Intel\ShaderCache`（新版驱动） | Intel |
| `AppData\Local\VulkanCache` | Vulkan |

有哪些取决于你的显卡，Steam 在自己的库里按游戏存了一份，可以看 [Steam 着色器缓存](/zh/windows/blog/steam-shader-cache-windows)。量系统缓存的大小：

```powershell
$p = "$env:LOCALAPPDATA\D3DSCache"
[math]::Round((Get-ChildItem $p -Recurse -Force -File -ErrorAction SilentlyContinue | Measure-Object Length -Sum).Sum / 1MB, 1)
```

单位是 MB。

## 什么时候清才有用

| 看到的情况 | 要不要清 | 原因 |
| --- | --- | --- |
| 更新驱动后开始花屏、崩溃或卡顿 | 值得试 | 过期或损坏的条目可能是原因，重建会换掉它们 |
| 缓存涨到很多 GB，又确实需要空间 | 可以 | 它会重新生成，但只有再玩的游戏才会 |
| 游戏每到新区域第一次都卡 | 不要 | 这正是在填充缓存，清了又要来一遍 |
| 电脑整体变慢 | 不要 | 和它没关系 |
| 日常清理 | 不需要 | 付出重建的代价，得到的很少 |

## 怎么清

系统缓存用内置的办法：

1. 打开“设置 › 系统 › 存储 › 临时文件”。
2. 勾选“DirectX 着色器缓存”，其他的按需要来。
3. 选择“删除文件”。

[磁盘清理](/zh/windows/blog/disk-cleanup-vs-storage-sense-windows)（`cleanmgr`）里也有同样的选项，Windows 把它注册成清理程序 `D3D Shader Cache`，ThinkPad 测试机上也有。

手动清的话，关掉游戏和显卡工具，用 `Win + R` 打开 `%LOCALAPPDATA%\D3DSCache`，删掉里面的内容，正在使用的跳过。驱动的缓存，关掉游戏后删上面文件夹里的内容，NVIDIA 控制面板的“着色器缓存大小”只限制它最多占多大。

## 清完会怎样

每个游戏第一次启动都要重新编译着色器，有的显示进度条，有的是走到新区域时卡一下，直到缓存填满，要多久取决于游戏和硬件，可能是几分钟，不要拿第一次游玩来判断效果。

## 不要这样做

- 不要在玩游戏或跑分之前清，那时候是最慢的。
- 不要定时清，它不是会堆出害处的垃圾，缓存一直是空的，就意味着一直在编译。
- 不要删上面路径之外的驱动文件夹，`C:\Windows\System32\DriverStore` 和驱动的安装文件夹都不是缓存。
- 不要指望它修好文件损坏的游戏，那要用启动器的校验功能。

## Mole 能做什么

Mole for Windows 的“清理”会按名字列出这些缓存，包括 **DirectX Shader Cache**、**DirectX Pipeline Cache** 和上面 NVIDIA、AMD、Vulkan 的文件夹，以及 Intel 旧的 `Local` 文件夹，每项都有大小，新版 Intel 驱动用的 `LocalLow` 文件夹 Mole 不会列出。它们默认不勾选，“推荐”也不包含，因为之后每个游戏都要重新编译着色器，你觉得值得时再勾。Steam 的按游戏缓存也是这样，`ProgramData` 里的 NVIDIA 缓存需要管理员权限。它们所在文件夹的其他内容，可以看 [AppData 里什么能删](/zh/windows/blog/appdata-folder-what-can-delete)。

## 常见问题

### 删除 DirectX 着色器缓存安全吗？

安全，Windows 会重建，代价是下次运行游戏时加载变慢或者有些卡顿。

### 删着色器缓存能提升性能吗？

通常不能，短期还会变差，只有缓存损坏造成花屏，或者确实需要磁盘空间时才有帮助。

### DirectX 着色器缓存存在哪里？

在 `%LOCALAPPDATA%\D3DSCache`，NVIDIA、AMD、Intel 和 Steam 在其他文件夹里有各自的缓存。

### 着色器缓存为什么清了又有？

因为游戏和 App 运行时又编译了着色器，这正是它的用途，不代表清理失败。

### 更新驱动后要清着色器缓存吗？

只有更新后出问题才需要，驱动通常会自己重建需要的内容，出现花屏或崩溃时清一下是合理的一步。


Canonical: https://mole.fit/zh/windows/blog/directx-shader-cache-windows
