> ## 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 游戏 OS 内存管理器

> 使用 Microsoft GDK 游戏 OS 内存管理器

尽管 Microsoft GDK 游戏 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](/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 游戏开发工具包 (GDK) 更新中将提供新的 API 来替代该功能。</Note>

### XMemVirtualAlloc

[XMemVirtualAlloc](/reference/system/xmem/functions/xmemvirtualalloc) 是为 Microsoft 游戏开发工具包 (GDK) 创建的新 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` 创建的适当预留中。也可以通过提供 32 个 2-MB 对齐的连续页来映射到 2 MB 预留中。

页可以以不同的页面保护属性多次映射。例如，一处映射可以是 `PAGE_READWRITE`，另一处可以是 `PAGE_READONLY`。但你不能以不同的缓存属性 (`WRITEBACK`、`WRITECOMBINE` 或 `UNCACHED`) 对同一页进行多次映射。这样做会返回错误。这在 XBOX One ERA 中同样不可行，虽然当时任何这样的尝试都会静默失败，让人误以为它成功了。

<Note>Microsoft GDK 游戏 OS 的虚拟内存工作方式与 Windows 内存系统一致。如果你使用 [XMemVirtualAlloc](/reference/system/xmem/functions/xmemvirtualalloc) 分配了两个在虚拟地址空间中相邻的地址，然后尝试用一次 [XMemMapPhysicalPages](/reference/system/xmem/functions/xmemmapphysicalpages) 调用同时映射这些页，其行为是未定义的，并且不应期望能够正常工作。尽管它们在虚拟地址空间中恰好相邻，但在内存系统看来它们是不同的分配。解除映射时同样如此。</Note>

### XMemVirtualQuery/XMemGetWorkingSetStatistics

[XMemVirtualQuery](/reference/system/xmem/functions/xmemvirtualquery) 和 [XMemGetWorkingSetStatistics](/reference/system/xmem/functions/xmemgetworkingsetstatistics) 是可用于查看 XBOX 特定内存使用细节的附加诊断 API。[XMemVirtualQuery](/reference/system/xmem/functions/xmemvirtualquery) 与 `VirtualQuery` 非常相似。`XMemVirtualQuery` 会返回一些 `VirtualQuery` 无法提供的附加信息，包括内存的页大小和归属（系统或游戏）。[XMemGetWorkingSetStatistics](/reference/system/xmem/functions/xmemgetworkingsetstatistics) 返回有关当前正在使用的内存占用情况的信息。


## Related topics

- [XBOX GDK 游戏的内存系统](/zh-CN/build/console-features/memory/index.md)
- [XMemMakeTag](/zh-CN/reference/system/xmem/functions/xmemmaketag.md)
- [从上一代 XBOX 移植](/zh-CN/paths/porting/from-xbox-era.md)
- [XMemFreePhysicalPages](/zh-CN/reference/system/xmem/functions/xmemfreephysicalpages.md)
- [PlayFab 统一 SDK 中的内存管理](/zh-CN/services/playfab/sdks/unified-sdk/memory-management.md)
