内存分配 API 系列
VirtualAlloc/VirtualFree
VirtualAlloc 和 VirtualFree 现在与 Windows PC 环境下这些 API 的标准实现完全相同。这为任何使用这些 API 获取内存的现有代码提供了高度兼容性。在 XBOX One ERA OS 中,VirtualAlloc 曾被修改为通过 MEM_TITLE、MEM_GRAPHICS 和 MEM_TOOL 标志分配 XBOX 特定类型的内存。现已不再支持这些标志。请改用 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 的频率。
在 XBOX One ERA OS 中,
HeapAlloc 曾被修改为接受 HEAP_TOOL 标志以通过 Win32 堆获取调试/扩展内存。此标志已被弃用,未来 Microsoft 游戏开发工具包 (GDK) 更新中将提供新的 API 来替代该功能。XMemVirtualAlloc
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 中同样不可行,虽然当时任何这样的尝试都会静默失败,让人误以为它成功了。
Microsoft GDK 游戏 OS 的虚拟内存工作方式与 Windows 内存系统一致。如果你使用 XMemVirtualAlloc 分配了两个在虚拟地址空间中相邻的地址,然后尝试用一次 XMemMapPhysicalPages 调用同时映射这些页,其行为是未定义的,并且不应期望能够正常工作。尽管它们在虚拟地址空间中恰好相邻,但在内存系统看来它们是不同的分配。解除映射时同样如此。
XMemVirtualQuery/XMemGetWorkingSetStatistics
XMemVirtualQuery 和 XMemGetWorkingSetStatistics 是可用于查看 XBOX 特定内存使用细节的附加诊断 API。XMemVirtualQuery 与VirtualQuery 非常相似。XMemVirtualQuery 会返回一些 VirtualQuery 无法提供的附加信息,包括内存的页大小和归属(系统或游戏)。XMemGetWorkingSetStatistics 返回有关当前正在使用的内存占用情况的信息。