Skip to main content
尽管 Microsoft GDK 游戏 OS 中内存管理器的内部实现有很大差异,但可用于分配和管理内存的 API 与 XBOX One ERA OS 中可用的 API 非常相似(虽然并不完全相同)。

内存分配 API 系列

VirtualAlloc/VirtualFree

VirtualAllocVirtualFree 现在与 Windows PC 环境下这些 API 的标准实现完全相同。这为任何使用这些 API 获取内存的现有代码提供了高度兼容性。在 XBOX One ERA OS 中,VirtualAlloc 曾被修改为通过 MEM_TITLEMEM_GRAPHICSMEM_TOOL 标志分配 XBOX 特定类型的内存。现已不再支持这些标志。请改用 XMemVirtualAlloc

HeapAlloc/HeapFree(及类似 API)

Win32 堆相关 API 也与 Windows PC 环境下这些 API 的标准实现完全相同。与 VirtualAlloc 类似,这为现有代码提供了高度兼容性。重要的是,HeapAllocHeapFree 正是 C 运行时/VCRuntime 库用于实现 malloc/new/free/delete 及相关 C 标准内存 API 的 API。 所有标准 Win32 堆均使用大页 (2 MB) 作为后端存储,以提供最佳性能。堆会高效地划分每个 2 MB 页以满足传入的分配请求,与基于 4 KB 页的 Win32 堆相比几乎不会增加内存占用。同时也降低了 Win32 堆在扩容时需要调用昂贵的 VirtualAlloc API 的频率。
在 XBOX One ERA OS 中,HeapAlloc 曾被修改为接受 HEAP_TOOL 标志以通过 Win32 堆获取调试/扩展内存。此标志已被弃用,未来 Microsoft 游戏开发工具包 (GDK) 更新中将提供新的 API 来替代该功能。

XMemVirtualAlloc

XMemVirtualAlloc 是为 Microsoft 游戏开发工具包 (GDK) 创建的新 API。它替代了在 XBOX One ERA 环境中使用 MEM_TITLEMEM_GRAPHICSMEM_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。但你不能以不同的缓存属性 (WRITEBACKWRITECOMBINEUNCACHED) 对同一页进行多次映射。这样做会返回错误。这在 XBOX One ERA 中同样不可行,虽然当时任何这样的尝试都会静默失败,让人误以为它成功了。
Microsoft GDK 游戏 OS 的虚拟内存工作方式与 Windows 内存系统一致。如果你使用 XMemVirtualAlloc 分配了两个在虚拟地址空间中相邻的地址,然后尝试用一次 XMemMapPhysicalPages 调用同时映射这些页,其行为是未定义的,并且不应期望能够正常工作。尽管它们在虚拟地址空间中恰好相邻,但在内存系统看来它们是不同的分配。解除映射时同样如此。

XMemVirtualQuery/XMemGetWorkingSetStatistics

XMemVirtualQueryXMemGetWorkingSetStatistics 是可用于查看 XBOX 特定内存使用细节的附加诊断 API。XMemVirtualQueryVirtualQuery 非常相似。XMemVirtualQuery 会返回一些 VirtualQuery 无法提供的附加信息,包括内存的页大小和归属(系统或游戏)。XMemGetWorkingSetStatistics 返回有关当前正在使用的内存占用情况的信息。
最后修改于 2026年8月24日