> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 核心記憶體使用量

> 核心記憶體使用量

在 Windows 和 Microsoft Game Development Kit (GDK) 中，核心記憶體以單一集區的形式存在，由核心和所有驅動程式共用。核心記憶體一律從系統分割區配置。

核心的大部分記憶體需求由平台負責，因此不會從遊戲的記憶體預算中扣除。

不過，以下說明遊戲程式碼何時會直接負責核心記憶體的使用。

* 每個虛擬記憶體保留區的追蹤結構
* 處理檔案、事件和執行緒同步處理物件
* 網路

遊戲應為其直接負責的核心使用量提供記憶體。由於核心記憶體以單一集區的形式存在，因此配置無法像二進位檔和堆積的平台與遊戲使用量那樣「分割」。

取而代之的是，系統使用不同的機制，讓開發人員能以確定性的方式提供必要的記憶體。

OS 在 Microsoft Game Development Kit (GDK) OS 的開機程序中，會配置其所耗用的幾乎所有核心記憶體。開機後，平台使用量的一般變動約為 1 到 2 MB。

啟動遊戲處理程序時，系統會查詢目前的核心記憶體耗用量，並在目前核心記憶體耗用量之上 16 MB 處建立「雜訊下限」。

建立此值的目的是，當超過限制時，這是遊戲行為的直接結果，而非一般 OS 變動所致。

監視的實作方式是檢測下列已知會導致核心記憶體配置的 API。

* `CreateFile`
* `CreateEvent`
* `CreateSemaphore`

如果在核心記憶體使用量接近或已超過閾值時呼叫其中一個 API，會透過 `XError` 和偵錯資料流提供額外資訊。

如果核心記憶體使用量已超過限制，API 呼叫會失敗，且 `GetLastError()` 值為 `ERROR\_NOT\_ENOUGH\_MEMORY`。

診斷輸出可在附加的偵錯工具、*xbwatson.exe* 和 *xbdbgmon.exe* 中檢視。

### 警告 (14 MB 時)

在 14 MB 觸發警告時，會出現下列輸出。

```text theme={null}
XERROR: HR:8007000E threadID:1096 WARNING: Title is consuming significant kernel pool memory. 
Use XMemGetWorkingSetStatistics to review usage and XMemTransferMemory to raise the quota.
```

### 錯誤 (16 MB 時)

在 16 MB 觸發錯誤時，會出現下列輸出。

```text theme={null}
\[XMEM\]: Initial Kernel Pool Usage: 19628032  
\[XMEM\]: Current Kernel Pool Usage: 36683776  
\[XMEM\]: Kernel Pool Limit: 36405248
  
Top Consumers:
```

下表顯示集區標籤格式。

| 標籤 | PagedAllocs | PagedFrees | PagedUsed | NonPagedAllocs | NonPagedFrees | NonPagedUsed |
| - | - | - | - | - | - | - |
| Even | 0 | 0 | 0 | 238750 | 219461 | 2469856 |
| Thre | 0 | 0 | 0 | 385 | 130 | 620160 |
| Mdl | 0 | 0 | 0 | 3843 | 3079 | 740080 |
| MmRe | 318 | 159 | 693520 | 0 | 0 | 0 |
| MmSt | 563 | 132 | 6133760 | 0 | 0 | 0 |
| File | 185 | 2 | 1096096 | 0 | 0 | 0 |
| TcDM | 0 | 0 | 0 | 1078 | 681 | 1587104 |
| AfdB | 0 | 0 | 0 | 86 | 35 | 1623152 |
| Mmww | 0 | 0 | 0 | 5503 | 705 | 530272 |
| Xvnc | 0 | 0 | 0 | 13 | 6 | 1448784 |
| XFSd | 0 | 0 | 0 | 1473 | 927 | 537040 |
| Sema | 0 | 0 | 0 | 12766 | 150 | 1615552 |

也會出現下列錯誤。

```text theme={null}
XERROR: HR:8007000E threadID:1164 ERROR: Title has exhausted kernel pool
quota. Common consumers include handles, thread sync. objects, and
virtual address reservations. Use XMemTransferMemory to raise the quota.
```

所有核心記憶體配置都會加上標籤 (類似於使用 `XMEM\_MAKE\_TAG` 和 `XMemVirtualAlloc` 加上標籤)，以指出記憶體的用途。標籤有助於判斷記憶體使用量的來源。

下表顯示與遊戲使用量相關的最常見「高使用率」標籤。

| 標籤 | 用途 |
| - | - |
| `Even` | 使用 `CreateEvent` 配置的事件物件。 |
| `File` | 由 `CreateFile` 配置的檔案控制代碼。 |
| `Sema` | 由 `CreateSemaphore` 配置的號誌物件。 |
| `Mmww` | 為支援 Performance Investigator for XBOX (PIX) GPU 擷取，針對圖形記憶體的任何 `MEM\_RESERVE` 所配置的「Write Watch」點陣圖。 |
| `MmSt`, `Mdl` | MM 用來追蹤實體頁面配置 (`XMemAllocatePhysicalPages`、`XMemMapPhysicalPages`) 和任何檔案對應 (`CreateFileMapping`，以及任何已載入的 .dll 或 .exe 檔案) 的控制結構。 |
| `XFSk`, `XFsm` | XRFS 所使用的記憶體，XRFS 是用於鬆散檔案部署和從 PC 執行案例的 Win32 檔案系統驅動程式。 |
| `TcDM`, `AfdB` | 網路驅動程式所使用的記憶體。 |

核心記憶體分為兩大類別，稱為「非分頁」和「分頁」。在 Microsoft Game Development Kit (GDK) 中，這些類別之間沒有功能上的差異，可以視為同義。

## 常見的核心記憶體成本

下表顯示所列每個動作的預期核心記憶體成本。

| 動作 | 成本 |
| - | - |
| 開啟檔案 | 每個檔案控制代碼約 2 KB |
| 事件和號誌 | 每個事件或號誌 128 位元組 (或每 100,000 個 12 MB) |
| 虛擬位址保留 | 每個 80 位元組 (或每 100,000 個 7.5 MB) |
| `XMemAllocatePhysicalPages` | 每個 64 KB 實體頁面 128 位元組 |

## 提高限制

較小型遊戲的記憶體使用量可能符合現有限制。不過，較大型的遊戲必須提供記憶體以支援其核心記憶體使用量。

[XMemTransferMemory](/zh-TW/reference/system/xmem/functions/xmemtransfermemory) API 用來提供必要的記憶體。

## 分析核心集區使用量

PIX 目前不支援監視核心集區使用量。您可以使用 xperf 和 Windows Performance Analyzer (WPA) 來監視耗用量。

使用下列步驟來分析核心記憶體。

1. 輸入命令 `xbrun /x/title xperf -start -on PROC_THREAD+LOADER+POOL -stackwalk PoolAlloc+PoolFree -f d:\krnl.etl`
2. 執行遊戲案例。
3. 輸入命令 `xbrun /x/title xperf -stop -d d:\krnl.merged.etl`
4. 輸入命令 `xbcp xd:\krnl.merged.etl %TEMP%\pool_usage.etl`
5. 在 WPA 中開啟 *pool\_usage.etl* 檔案，並如圖 1 所示進行分析。

**圖 1. 顯示 WPA 中的核心記憶體集區分析。**

<img src="https://mintcdn.com/microsoft-4404708b/CwRBzaXvHw9zaPoe/images/gdk/features/console/KernelMemoryWPA.png?fit=max&auto=format&n=CwRBzaXvHw9zaPoe&q=85&s=444da8b2e7d960f62fdf47f38c3fff12" alt="WPA 中核心記憶體集區分析的螢幕擷取畫面" width="1185" height="441" data-path="images/gdk/features/console/KernelMemoryWPA.png" />


## Related topics

- [NDA 主題目錄 - Microsoft Learn 線上連結](/zh-TW/nda/nda-topic-directory.md)
- [PlayFab Party 版本資訊](/zh-TW/services/playfab/multiplayer/networking/release-notes.md)
- [從先前世代的 XBOX 移植](/zh-TW/paths/porting/from-xbox-era.md)
- [移植到 XBOX GDK 的指南](/zh-TW/home/build-first-title/porting-guides.md)
- [PlayFab Multiplayer C++ SDK 版本資訊](/zh-TW/services/playfab/multiplayer/lobby/lobby-matchmaking-sdks/lobby-and-matchmaking-release-notes.md)
