記憶體配置 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 Game Development Kit (GDK) 的未來更新中,將會提供新的 API 來取代此功能。XMemVirtualAlloc
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 中也不可行,不過任何這麼做的嘗試都會無訊息地失敗,看起來像是成功了。
Microsoft GDK Game OS 虛擬記憶體的運作方式與 Windows 記憶體系統相同。如果您使用 XMemVirtualAlloc 配置兩個在虛擬位址空間中相鄰的位址,然後嘗試以一次 XMemMapPhysicalPages 呼叫來對應這些頁面,其行為是未定義的,預期無法運作。即使它們在虛擬位址空間中剛好彼此相鄰,就記憶體系統而言它們仍是不同的配置。取消對應頁面時也適用相同的情況。
XMemVirtualQuery/XMemGetWorkingSetStatistics
XMemVirtualQuery 和 XMemGetWorkingSetStatistics 是額外的診斷 API,可用來調查 XBOX 特定的記憶體使用詳細資料。XMemVirtualQuery 與VirtualQuery 非常類似。XMemVirtualQuery 會傳回 VirtualQuery 無法提供的額外資訊,包括記憶體的頁面大小和擁有權 (系統或遊戲)。XMemGetWorkingSetStatistics 會傳回目前使用中記憶體使用量的相關資訊。