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

# 使用 Microsoft GDK Game OS 記憶體管理員

> 使用 Microsoft GDK Game OS 記憶體管理員

雖然 Microsoft GDK Game OS 中記憶體管理員的內部運作非常不同，但可用來配置和管理記憶體的 API 與 XBOX One ERA OS 中可用的 API 非常類似 (但並不完全相同)。

## 記憶體配置 API 系列

### VirtualAlloc/VirtualFree

`VirtualAlloc` 和 `VirtualFree` 現在與 Windows PC 環境中這些 API 的標準實作完全相同。這讓任何使用這些 API 取得記憶體的現有程式碼都具有高度相容性。在 XBOX One ERA OS 中，`VirtualAlloc` 經過修改，可透過 `MEM_TITLE`、`MEM_GRAPHICS` 和 `MEM_TOOL` 旗標配置 XBOX 特定的記憶體類型。這些旗標已不再受支援。請改用 [XMemVirtualAlloc](/zh-TW/reference/system/xmem/functions/xmemvirtualalloc)。

### HeapAlloc/HeapFree (及類似 API)

Win32 堆積相關 API 也與 Windows PC 環境中這些 API 的標準實作完全相同。與 `VirtualAlloc` 一樣，這讓現有程式碼具有高度相容性。重要的是，`HeapAlloc` 和 `HeapFree` 是 C 執行階段/VCRuntime 程式庫用來實作 `malloc`/`new`/`free`/`delete` 及相關 C 標準記憶體 API 的 API。

所有標準 Win32 堆積都使用大型 (2 MB) 頁面作為後端儲存空間，以提供最佳效能。堆積會有效率地細分每個 2 MB 頁面以滿足傳入的配置，與使用 4 KB 頁面的 Win32 堆積相比，記憶體使用量幾乎沒有增加。這也降低了 Win32 堆積在擴充時必須對 `VirtualAlloc` 進行成本高昂之 API 呼叫的頻率。

<Note>在 XBOX One ERA OS 中，`HeapAlloc` 經過修改，可接受 `HEAP_TOOL` 旗標以透過 Win32 堆積取得偵錯/延伸記憶體。此旗標已被取代，而且在 Microsoft Game Development Kit (GDK) 的未來更新中，將會提供新的 API 來取代此功能。</Note>

### XMemVirtualAlloc

[XMemVirtualAlloc](/zh-TW/reference/system/xmem/functions/xmemvirtualalloc) 是為 Microsoft Game Development Kit (GDK) 建立的新 API。此 API 取代 XBOX One ERA 環境中以 `MEM_TITLE`、`MEM_GRAPHICS` 和 `MEM_TOOL` 旗標進行的 `VirtualAlloc` 呼叫。其參數和呼叫慣例與 `VirtualAlloc` 非常相近，另外新增了 `XMemFlags` 欄位，讓呼叫端可以新增更多有關所需記憶體類型的 (XBOX 特定) 詳細資料。

### XMemAllocatePhysicalPages/XMemMapPhysicalPages/XMemFreePhysicalPages

您可以使用實體頁面對應 API 來取得記憶體中實體頁面的索引。以這種方式配置頁面，可讓遊戲完全控制 RAM 的擁有權。傳回的頁碼可視需要組合並對應到遊戲的虛擬位址空間。

與 XBOX One ERA OS 一樣，傳回的每個實體頁碼代表 64 KB 的 RAM。個別頁面或任意頁面群組可以對應到以 `MEM_64K_PAGES` 建立的適當保留區。藉由提供 2 MB 對齊、由 32 個連續頁面組成的群組，也可以對應到 2 MB 保留區。

頁面可以使用不同的頁面保護多次對應。例如，一個對應可以是 `PAGE_READWRITE`，而另一個是 `PAGE_READONLY`。不過，您無法以不同的快取屬性 (`WRITEBACK`、`WRITECOMBINE` 或 `UNCACHED`) 多次對應一個頁面。嘗試這麼做會傳回錯誤。這在 XBOX One ERA 中也不可行，不過任何這麼做的嘗試都會無訊息地失敗，看起來像是成功了。

<Note>Microsoft GDK Game OS 虛擬記憶體的運作方式與 Windows 記憶體系統相同。如果您使用 [XMemVirtualAlloc](/zh-TW/reference/system/xmem/functions/xmemvirtualalloc) 配置兩個在虛擬位址空間中相鄰的位址，然後嘗試以一次 [XMemMapPhysicalPages](/zh-TW/reference/system/xmem/functions/xmemmapphysicalpages) 呼叫來對應這些頁面，其行為是未定義的，預期無法運作。即使它們在虛擬位址空間中剛好彼此相鄰，就記憶體系統而言它們仍是不同的配置。取消對應頁面時也適用相同的情況。</Note>

### XMemVirtualQuery/XMemGetWorkingSetStatistics

[XMemVirtualQuery](/zh-TW/reference/system/xmem/functions/xmemvirtualquery) 和 [XMemGetWorkingSetStatistics](/zh-TW/reference/system/xmem/functions/xmemgetworkingsetstatistics) 是額外的診斷 API，可用來調查 XBOX 特定的記憶體使用詳細資料。[XMemVirtualQuery](/zh-TW/reference/system/xmem/functions/xmemvirtualquery) 與 `VirtualQuery` 非常類似。`XMemVirtualQuery` 會傳回 `VirtualQuery` 無法提供的額外資訊，包括記憶體的頁面大小和擁有權 (系統或遊戲)。[XMemGetWorkingSetStatistics](/zh-TW/reference/system/xmem/functions/xmemgetworkingsetstatistics) 會傳回目前使用中記憶體使用量的相關資訊。


## Related topics

- [從先前世代的 XBOX 移植](/zh-TW/paths/porting/from-xbox-era.md)
- [移植到 XBOX GDK 的指南](/zh-TW/home/build-first-title/porting-guides.md)
- [NDA 主題目錄 - Microsoft Learn 線上連結](/zh-TW/nda/nda-topic-directory.md)
- [使用 GDKX 建置並執行你的第一個主機遊戲](/zh-TW/home/build-first-title/first-console-title-walkthrough.md)
- [Direct3D 12 程式設計指南](/zh-TW/build/gdk-and-engines/guides/directx-12-programming-guide.md)
