# Windows 上的 DirectX Shader Cache 可以刪嗎

DirectX Shader Cache 存放的是 shader，也就是顯示卡執行的小程式，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 的 shader 快取](/tw/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 Shader Cache**，其他項目依你的需要決定。
3. 選擇 **移除檔案**。

[磁碟清理](/tw/windows/blog/disk-cleanup-vs-storage-sense-windows)（`cleanmgr`）也有相同的選項。Windows 把它登記為清理處理常式 `D3D Shader Cache`，測試用的 ThinkPad 上也有。

手動的話，先關掉遊戲和繪圖工具，用 `Win + R` 打開 `%LOCALAPPDATA%\D3DSCache`，再刪除裡面的內容。正在使用中的就跳過。驅動程式的快取，在遊戲關閉時，刪除上面那些資料夾裡的內容即可。NVIDIA 控制面板的 **Shader Cache Size** 只是限制它最大能長到多大。

## 清完之後會怎樣

每個遊戲第一次啟動時會重新編譯 shader。有些遊戲會顯示進度條，有些則在你移動到新區域時卡頓，直到快取重新填滿。要多久取決於遊戲和你的硬體，可能要幾分鐘。不要用第一次遊玩的感覺來判斷結果。

## 不要這樣做

- 不要在要玩遊戲或跑跑分之前清。那時候它會是最慢的狀態。
- 不要排程自動清。它不是會以任何有害的方式堆積的垃圾，永遠是空的快取就代表永遠在編譯。
- 不要刪上面那些路徑以外的驅動程式資料夾。`C:\Windows\System32\DriverStore` 和驅動程式的安裝資料夾不是快取。
- 不要期望它能修好檔案損壞的遊戲。那要用啟動器的驗證選項。

## Mole 能幫上什麼

Mole for Windows 的「清理」會用名稱列出這些快取，包括 **DirectX Shader Cache**、**DirectX Pipeline Cache**，以及上面的 NVIDIA、AMD 和 Vulkan 資料夾，還有 Intel 較舊的 `Local` 資料夾，每一項都附上大小。Mole 不會列出目前的 Intel 驅動程式使用的 `LocalLow` 資料夾。它們預設不勾選，「建議」也不會包含，因為每個遊戲之後都得重新編譯 shader。你決定這個代價值得的時候，再自己勾選。Steam 每個遊戲的快取也以同樣的方式出現，而 `ProgramData` 裡的 NVIDIA 快取需要系統管理員權限。關於它們所在的資料夾，見[AppData 裡哪些能刪](/tw/windows/blog/appdata-folder-what-can-delete)。

## 常見問題

### 刪除 DirectX Shader Cache 安全嗎？

安全。Windows 會重建它。代價是遊戲下次執行時載入比較慢，或有些卡頓。

### 刪掉 shader 快取會提升效能嗎？

通常不會，短期內還會變差。在損壞的快取造成異常，或你需要磁碟空間時才有幫助。

### DirectX Shader Cache 存在哪裡？

在 `%LOCALAPPDATA%\D3DSCache`。NVIDIA、AMD、Intel 和 Steam 各自在其他資料夾有自己的快取。

### 為什麼 shader 快取一直回來？

因為遊戲和 App 執行時會再次編譯 shader，這就是它的用途，所以不代表清理失敗。

### 更新驅動程式後要清 shader 快取嗎？

只有在更新後出問題才要。驅動程式通常會自己重建需要的東西，看到異常或當機時，清除是合理的一步。


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