> ## 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.

# 記憶體

> GDK 記憶體管理員如何讓 XBOX 主機遊戲獲得具確定性、高效能的實體記憶體存取，並提供可預測的資源保證。

## 簡介

與大多數必須允許多個應用程式同時在其硬體上執行的運算應用程式不同，遊戲主機會嘗試保證遊戲能獨佔存取裝置的資源。雖然大多數主機的規格都低於高階遊戲 PC，但這讓主機遊戲能針對其目標平台明確進行最佳化，進而提供超高品質的體驗，超越您從原始硬體數據所能預期的表現。

現今，玩家期待各種功能 (尤其是社交和線上功能)，而這些功能有其成本，需要稍微放寬資源保證才能支援。這讓 XBOX 等服務和平台提供者能以一致的方式在各遊戲中實作這些功能。

Microsoft Game Development Kit (GDK) 為遊戲開發人員提供高效能、具確定性且可預測的實體記憶體存取。雖然我們先前的 XBOX One ERA OS 記憶體管理員滿足了遊戲開發人員的許多需求，但我們也收到許多關於如何改善的意見反應。例如，過去遊戲程式碼與平台服務之間的記憶體資源共用，並未達到應有的確定性。

我們重建了記憶體管理員來解決這些問題，同時謹慎保留我們最成功的部分。

我們的新架構提供遊戲開發人員想要且期待的更具體、更具確定性的保證。此架構保留了 XBOX One 遊戲已經依賴的效能最佳化和彈性。

## 架構圖

下圖顯示 Microsoft Game Development Kit (GDK) 的記憶體架構。

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/images/gdk/features/console/mem_overview_arch.png" alt="Microsoft Game Development Kit 記憶體架構圖" />

## 主要功能

* 與 XBOX One ERA 系統高度相似，可延續開發人員現有的知識和專業：
  * 包括將 64 KB/2 MB 頁面配置為未初始化記憶體的最佳化
  * `XMemAlloc` API 系列
  * 以 64 KB 細微度進行實體頁面配置和對應
* 在遊戲元件與非遊戲 (平台) 元件之間嚴格隔離記憶體耗用量
* 在執行階段追蹤遊戲分割區空間中的所有記憶體耗用量
* 所有 Win32 堆積皆使用 2 MB 頁面以提升效能

> \[!NOTE] `XMemAlloc` 和 `XMemFree` 預設實作的原始程式碼會隨 Microsoft Game Development Kit (GDK) 一併安裝。請參閱 *\GXDK\gameKit\Source\amd64\heap.c*。

## 概觀

### 記憶體分割區

Microsoft Game Development Kit (GDK) 記憶體架構延續為 XBOX One ERA OS 建立的「三集區」模型。在此架構中，每個集區對特定類別的記憶體使用量擁有明確的擁有權。

* **系統分割區：** 負責系統處理程序和平台配置，以及平台可執行頁面
* **遊戲分割區：** 負責由遊戲處理程序所驅動的所有記憶體耗用量，以及遊戲的可執行頁面
* **工具分割區：** 選用的記憶體集區，可用來將延伸/偵錯記憶體與零售記憶體隔離 (僅適用於開發套件)

記憶體分割區在內部實作為 OS 記憶體管理員的唯一執行個體，每個分割區都擁有專用的實體記憶體配額。不同的分割區也可以有各自的行為原則，例如分頁和零初始化行為。遊戲分割區設定為為遊戲處理程序提供最佳效能，其行為經過調整以提供下列功能：

* 通常在配置期間，Windows 記憶體管理員會將記憶體頁面填零作為安全措施。對於遊戲分割區，此功能已停用，將這部分效能還給您的遊戲。

如需核心記憶體使用量的詳細資料，請參閱[核心記憶體使用量](/zh-TW/build/console-features/memory/kernel_memory_usage)。

### 分隔遊戲和系統記憶體配置

Microsoft Game Development Kit (GDK) Game OS 透過記憶體分割區確保系統和遊戲記憶體使用率的隔離。所有處理程序在啟動時都會被指派一個記憶體分割區。由於所有系統處理程序都在系統記憶體分割區內啟動，這些處理程序無法從遊戲所使用的遊戲分割區配置任何記憶體。另一方面，遊戲處理程序使用遊戲分割區，並從這個專用集區取得記憶體。

遊戲處理程序在啟動時會套用數項自訂，以達成遊戲與系統程式碼之間的記憶體配置隔離。這些自訂包括：

* 檔案系統迷你篩選器驅動程式會監視每個檔案對應，並將檔案分類為系統檔案 (例如 *kernelbase.dll*) 或遊戲檔案。系統檔案會標記為針對系統分割區配置，而遊戲檔案則計入遊戲分割區。
* 系統和遊戲分割區中都會建立個別的 Win32 堆積 (遊戲堆積會在第一次使用時建立)，分別擁有由系統和遊戲程式碼所做的堆積配置。
* 透過每個模組的匯入位址表呼叫的配置相關 API，會在載入時重新導向至不同的實作，這些實作會根據來源 DLL，從系統或遊戲分割區處理配置。

因此，系統分割區會負責載入 OS 和平台二進位檔的成本，以及所產生的任何持續性或暫時性記憶體配置。

### 計入遊戲的記憶體成本

遊戲分割區仍負責涵蓋下列項目：

* 遊戲處理程序特定的程式碼和資料/內容的記憶體使用量。
* 遊戲處理程序所載入之模組的所有已修改資料區段 (亦即寫入時複製區段)。
* 執行緒堆疊空間。
* 遊戲處理程序進行虛擬到實體位址轉譯所需的分頁表項目。
* 建立傳入系統 API 呼叫之緩衝區所需的記憶體。
* 擷取系統 API 呼叫、非同步作業和通知結果所需的記憶體。
* 使用功能所需的其他中繼資料。例如，堆積需要中繼資料來追蹤配置。這些中繼資料會針對堆積執行的任何配置計入遊戲分割區。

### 監視記憶體使用率和配置呼叫

Microsoft Game Development Kit (GDK) 記憶體系統廣泛支援在執行階段監視和追蹤記憶體使用。

`XMEM_SET_ALLOCATION_HOOKS` 巨集可追蹤透過 `XMemAlloc` 呼叫傳回的記憶體。此外，所有 Win32 堆積配置都可以透過設定的追蹤回呼 (請參閱 [XMemSetWin32HeapTrackingHooks](/zh-TW/reference/system/xmem/functions/xmemsetwin32heaptrackinghooks)) 來監視，以攔截任何 `malloc`/`new`/`HeapAlloc` 的使用。

最後，`XMemGetWorkingSetStatistics` 和 [XMemVirtualQuery](/zh-TW/reference/system/xmem/functions/xmemvirtualquery) API 可用來提供實體和虛擬記憶體使用率的詳細快照。[XMemVirtualQuery](/zh-TW/reference/system/xmem/functions/xmemvirtualquery) 與 `VirtualQuery` 非常類似，但會傳回 `VirtualQuery` 無法提供的額外資訊，包括記憶體的頁面大小和擁有權 (系統或遊戲)。

如需可用於執行階段記憶體追蹤之 API 的詳細資訊，請參閱[移植您的遊戲以使用 Microsoft GDK Game OS 記憶體管理員](/zh-TW/build/console-features/memory/system-memory-porting)中的「追蹤記憶體」一節。

## 分割區大小

與先前版本相比，此版本的一項重大變更是，主機設定為提供與您的遊戲在\_零售消費者\_環境中預期會遇到的相同記憶體設定。

此外，也新增了工具分割區的支援。[移植您的遊戲以使用 Microsoft GDK Game OS 記憶體管理員](/zh-TW/build/console-features/memory/system-memory-porting)主題說明為提供具確定性的記憶體計量模型所做的變更。開發人員現在可保證其程式碼擁有一致的記憶體集區，同時確保平台二進位檔和暫時性配置會計入與遊戲可定址記憶體空間分開的系統記憶體集區。

### 分析模式

分析模式是一個選項，可將部分系統 OS 資源轉給遊戲使用，這是 PIX 等工具發揮完整功能所必需的。啟用分析模式時，部分功能 (例如 Hub 應用程式、Game DVR 和 Microsoft Edge) 的體驗可能會降低，或可能完全無法運作。您可以使用 XBOX Manager、*xbconfig.exe* (在 Windows PC 上)、*wdconfig.exe* (在主機上) 或主機上的 Developer Home Shell 來啟用或停用此模式，以還原這些功能。

啟用分析模式時，如果需要更多記憶體，可以選擇將額外的延伸/偵錯記憶體新增到遊戲集區。若要將更多記憶體新增到遊戲空間，請使用下列命令：

```text theme={null}
  xbconfig ExtraTitleMemory=<value>
```

或者，在 XBOX Manager 或 Developer Home Shell 中開啟 **Extra Title Memory** 設定的切換開關。

#### 記憶體設定

下表說明記憶體設定。

| 主機類型 | 主機模式 | 遊戲記憶體模式 | 遊戲記憶體 | 工具記憶體 |
| :- | :-: | :-: | :-: | -: |
| XBOX One/XBOX One S | | | 5,120 MiB | 1,012 MiB |
| XBOX One X | | 標準<br />進階 | 8,128 MiB<br />9,152 MiB | 2,024 MiB<br /> 1,012 MiB |
| | | | | |
| XBOX One X 開發套件 | XBOX One / XBOX One S | | 5,120 MiB | 5,028 MiB |
| XBOX One X 開發套件 | XBOX One X 測試 | 標準<br />進階 | 8,128 MiB<br />9,152 MiB | 2,024 MiB<br /> 1,012 MiB |
| XBOX One X 開發套件 | XBOX One X 開發套件 \[44] | 標準<br />進階 | 8,128 MiB<br />9,152 MiB | 14,168 MiB<br />13,156 MiB |
| | | | | |
| XBOX Series S | | 標準<br />進階 | 7,998 MiB<br />8,572 MiB | 不適用 |
| XBOX Series X | | 標準<br />進階 | 10,208 MiB<br />13,312 MiB | 不適用 |
| | | | | |
| XBOX Series X 開發套件 | Lockhart 分析 (XBOX Series S) | 標準<br />進階 | 7,998 MiB<br />8,572 MiB | 6,056 MiB<br />6,048 MiB |
| XBOX Series X 開發套件 | Anaconda 分析 (XBOX Series X) | 標準<br />進階 | 10,208 MiB<br />13,312 MiB | 9,614 MiB<br />15,666 MiB |
| XBOX Series X 開發套件 | Scarlett 40GB | | 37,156 MiB | |

<Note>
  上表中的工具記憶體僅在啟用分析模式時可用。
</Note>


## Related topics

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