Skip to main content

XMemAllocDefault

預設的記憶體配置常式。

語法

參數

Size 類型:SIZE_T [in] 所要求的記憶體區塊大小。 Attributes
類型:ULONGLONG
[in] 配置的屬性。請參閱 XALLOC_ATTRIBUTES 傳回值 類型:PVOID 傳回指向已配置記憶體區塊的指標。 備註 系統匯出兩個預設函式:XMemAllocDefault 和 XMemFreeDefault。這些代表配置攔截程序的初始值。如果遊戲選擇不提供自己的配置攔截程序,則會改用這些系統預設配置器。如果遊戲想要提供配置攔截程序以進行追蹤,但不想實作自己的配置器,則可以直接呼叫預設配置器。 XMemAllocDefault 接受與 XMemAlloc 相同的參數。它為不想攔截此行為,或想要在未處理的情況下回復為預設行為的遊戲,提供 XMemAlloc 的作業系統實作。 XBOX 平台會將其對遊戲記憶體進行的所有配置都透過 XMemAlloc 進行,讓開發人員有機會監視或處理平台的記憶體需求。遊戲可以針對透過 XMemAlloc 傳入的部分或全部要求提供自己的記憶體管理員。其餘的要求則使用 XMemAllocDefault API。XMemAllocDefault 透過以下三種機制之一來處理配置要求:HeapAlloc、VirtualAlloc 或一系列內部管理的堆積。要使用這三種機制中的哪一種,取決於配置的類型和對齊需求。 顯示 XMemAllocDefault 作為 HeapAlloc、VirtualAlloc 和 Xmem 堆積之介面的圖表 每個類型為 XALLOC_MEMTYPE_HEAP_CACHEABLE 的配置,只要指定的對齊 <= 16 位元組且頁面大小為 4 KB,就會交由 HeapAlloc 處理。 類型為 XALLOC_MEMTYPE_PHYSICAL_* 的配置,或需要 32b 位址、或 > 128 KB、或需要對齊 >= 64 KB 的配置,都會交由 XMemVirtualAlloc 處理。 指定 XALLOC_PAGESIZE_2MB_* 的配置會交由 XMemVirtualAlloc 處理。 類型為 XALLOC_MEMTYPE_GRAPHICS_* 的配置會提升為最小 64 KB 的頁面大小。 否則,配置將由 XMemAllocDefault 的內部堆積處理。15 種已記載的配置類型各有兩個堆積;一個處理對齊 <= 4 KB 且 < 4 KB 的配置 (「小型區塊」堆積),另一個處理所有其他配置 (「大型區塊」堆積)。總計共 30 個堆積。 XMemAllocDefault 堆積詳細資料
  • 堆積會視需要建立,因此如果特定大型/小型大小沒有特定類型的配置,則永遠不會建立該堆積。
  • 每個堆積會保留 2 GB 的虛擬位址空間。因此,指定堆積的配置不能超過 2 GB。
  • 如果堆積設定為使用 2MB 頁面,每個堆積會視需要認可 2 MB 頁面,因此即使要求 64 KB 頁面,每個配置也會從 2 MB 頁面滿足。根據預設,如果系統的 2 MB 頁面已用盡,使用 2 MB 頁面的堆積可以降級為 64KB 頁面。您可以透過搭配 XMemSetOption 使用 eXMEMOPT_XMEMALLOCDEFAULT_DISABLEPAGESIZEDEMOTION 來停用此降級行為。
  • 如果堆積設定為使用 64KB 頁面,每個堆積會視需要認可 512 KB 的頁面。
  • 每個堆積都是單一執行緒,因此來自多個執行緒的同時配置和/或釋放要求會被序列化。只有在每個個別堆積內才需要序列化,因此來自不同堆積的同時要求可以同時處理。
  • 每個堆積會嘗試盡可能緊密地封裝配置 (同時仍滿足對齊條件約束),以將支援堆積所需的記憶體量降到最低。
  • 每個堆積可以指定自己的配置遲滯,這決定了記憶體釋放後歸還給作業系統的積極程度。根據預設,每個圖形堆積指定 64 MB 的遲滯,而 XALLOC_MEMTYPE_HEAP_CACHEABLE 堆積指定 8 MB (這些堆積不太可能被使用,因為可快取的堆積配置通常不會指定 > 16 位元組的對齊需求)。如果遲滯設定為 64 MB,表示堆積必須累積 64 MB 的可用頁面,才會將任何可用頁面歸還給作業系統。這可確保只要所需的記憶體量在遲滯量內波動,堆積程式碼就永遠不需要再向作業系統要求。
  • 堆積一開始沒有認可的記憶體,並會視需要向作業系統要求記憶體。不過,如有需要,堆積可以透過針對該堆積呼叫 XMemPreallocateFreeSpace,從作業系統預先配置記憶體。這實際上會將該堆積的可用頁面保留量提升至遲滯上限。
另請參閱 xmem_set_allocation_hooks xmem_allocation_hooks
Last modified on October 6, 2026