Skip to main content

XMemVirtualAlloc

保留、認可或變更呼叫處理序之虛擬位址空間中某個分頁區域的狀態。
與標準 Win32 VirtualAlloc 不同,此函式所配置的記憶體_不_保證會自動初始化為零。

語法

參數

BaseAddress _In_opt_
類型:PVOID
要配置之區域的起始位址。如果正在保留記憶體,指定的位址會無條件捨去至配置細微度 (在 XBOX 上為 4K、64K 或 2MB) 最接近的倍數。如果記憶體已保留且正在認可,則位址會無條件捨去至下一個分頁邊界。如果此參數為 NULL,系統會決定要在何處配置區域。
Size _In_
類型:SIZE_T
區域的大小 (以位元組為單位)。如果 BaseAddress 參數為 NULL,此值會無條件進位到下一個分頁邊界。否則,配置的分頁會包含在 BaseAddress 到 BaseAddress+Size 範圍內含有一或多個位元組的所有分頁。這表示跨越分頁邊界的 2 位元組範圍會導致兩個分頁都包含在配置的區域中。
AllocationType _In_
類型:DWORD
記憶體配置的類型。此參數必須包含下列其中一個值。 此參數也可以指定下列值,如下所示。
對於 ERA 遊戲,MEM_LARGE_PAGES 代表 64K 分頁,而在 Windows 桌面上代表 2MB 分頁。由於有此歧義,Microsoft Game Development Kit (GDK) 已將其移除。

XMemFlags _In_
類型:ULONGLONG
在 XBOX 上用來取得特定的特殊記憶體類型。此參數必須包含下列其中一個值。 在 XBOX 上,可以配置具有受限虛擬記憶體位址的記憶體,以保證不會使用高位元。使用下列任一值會將位址限制為只使用指定的位元數。XMEM_40BIT_ADDRESS (0x00007000ULL)、XMEM_41BIT_ADDRESS (0x00006000ULL)、XMEM_42BIT_ADDRESS (0x00005000ULL)、XMEM_43BIT_ADDRESS (0x00004000ULL)、XMEM_44BIT_ADDRESS (0x00003000ULL)、XMEM_45BIT_ADDRESS (0x00002000ULL)、XMEM_46BIT_ADDRESS (0x00001000ULL)。
在建立 D3D12Device 或呼叫 D3DConfigureVirtualMemory 之前,無法配置圖形記憶體。如果要求的記憶體將對 GPU 可見,遊戲_必須_同時指定明確的圖形分頁保護旗標,不再有依據 CPU 分頁保護設定的預設值。這是與舊版 XBOX OS 不同之處。
此參數也可以指定下列值,如下所示。 在 Anaconda 裝置以及模擬 Anaconda 的 Dante 裝置上,使用進階遊戲記憶體模式時,也可以套用下列參數。在所有其他情況下,這些參數都會被忽略。
這些旗標是選擇性的。如果未指定,所有圖形配置預設都會使用 XMEM_GPU_OPTIMAL_BANDWIDTH_PREFERRED,而所有其他配置預設都會使用 XMEM_STANDARD_BANDWIDTH_PREFERRED。
XMemFlags 參數包含選擇性的四字元代碼標籤。字元可以是 a-z、A-Z、0-9 和 $ 中的任一字元。可使用 XMemMakeTag 函式,在正確的位元位置建構正確編碼的標籤值。標籤只能與已認可的記憶體區域建立關聯,而不能與保留建立關聯。此四字元代碼標籤會由參數的高 24 位元表示。標籤可透過 XMemVirtualQuery 擷取,也會顯示在 PIX 記憶體分析中。 範例:

PageProtection _In_
類型:DWORD
要配置之分頁區域的記憶體保護。如果正在認可分頁,您可以指定任一 記憶體保護常數。 PageProtection 參數允許使用下列 XBOX 專屬值,且指定 XMEM_GRAPHICS 或 XMEM_GRAPHICS_32BIT_ADDRESS 時必須指定其中一個值。此需求是與舊版 XBOX OS 不同之處。對於以 XMEM_GRAPHICS 配置之範圍內的記憶體位址,這些值也可以指定給其他記憶體管理函式 (例如 VirtualProtect)。 此參數也可以指定下列值,如下所示。

傳回值

類型:PVOID 如果函式成功,傳回值為所配置分頁區域的基底位址。 如果函式失敗,傳回值為 NULL。若要取得延伸錯誤資訊,請呼叫 GetLastError。

備註

每個分頁都有相關聯的 分頁狀態。XMemVirtualAlloc 函式可以執行下列作業:
  • 認可保留分頁的區域
  • 保留可用分頁的區域
  • 同時保留和認可可用分頁的區域
XMemVirtualAlloc 無法保留已保留的分頁。它可以認可已認可的分頁。這表示您可以認可某個範圍的分頁,無論這些分頁是否已認可,函式都不會失敗。 您可以使用 XMemVirtualAlloc 保留一個分頁區塊,然後再呼叫 XMemVirtualAlloc 來認可保留區塊中的個別分頁。這可讓處理序保留其虛擬位址空間的範圍,而在需要之前不會耗用實體儲存體。 如果 BaseAddress 參數不是 NULL,函式會使用 BaseAddress 和 Size 參數來計算要配置的分頁區域。整個分頁範圍目前的狀態必須與 AllocationType 參數所指定的配置類型相容。否則,函式會失敗,且不會配置任何分頁。如前所述,此相容性需求並不排除認可已認可的分頁。 XMemVirtualAlloc 函式可用於在呼叫處理序的虛擬位址空間內保留指定用來對應實體分頁的記憶體區域。接著,此記憶體區域便可依應用程式的需要,用來將實體分頁對應進出虛擬記憶體。必須在 AllocationType 參數中設定 MEM_RESERVE 和 MEM_64K_PAGES 值;不得設定 MEM_COMMIT 值。必須在 XMemFlags 參數上設定 XMEM_MAPPABLE。以此方式保留的位址空間是使用 XMemMapPhysicalPages API 來認可。 VirtualFree 函式可以解除認可已認可的分頁並釋放該分頁的儲存體,也可以同時解除認可並釋放已認可的分頁。它也可以釋放保留的分頁,使其成為可用分頁。 除了提供 XBOX 專屬記憶體特性的延伸之外,此 API 與 VirtualAlloc 的差異在於,它不強制保證傳回的記憶體會初始化為零。XMemVirtualAlloc 也不保證會保留先前的記憶體內容。遊戲中 XMemVirtualAlloc 的大多數使用案例涉及取得圖形記憶體 (通常不會因初始化為零而受益),或將記憶體新增至堆積實作 (從零初始化中獲得的實用價值很少)。此外,呼叫端可以輕易地在自己選擇的時間實作將傳回的記憶體初始化為零。由於不強制 VirtualAlloc 的這項保證,XMemVirtualAlloc 的實作有更大的彈性,能夠提供更高的效能。 XMemVirtualAlloc 與 VirtualAlloc 的另一個差異在於,透過此 API 呼叫取得的記憶體可以立即使用。相較之下,VirtualAlloc 傳回的記憶體位址只會在第一次存取時,透過代價高昂的分頁錯誤作業填入實體分頁。 以 XMemVirtualAlloc 配置的記憶體應使用 VirtualFree 釋放。 PAGE_NOCACHE 和 PAGE_WRITECOMBINE 分頁保護旗標會在記憶體保留時固定,無法在之後的認可要求期間變更。認可記憶體時嘗試變更這些旗標其中之一的狀態,將會被無聲地忽略。記憶體認可會成功,但記憶體的這些旗標仍會保持原始狀態。 範例:

需求

標頭: xmem.h 程式庫: xmem.lib 支援的平台: XBOX One 系列主機和 XBOX Series 主機

另請參閱

XMem 參考
XMemMapPhysicalPages
VirtualFree
Last modified on October 6, 2026