判斷malloc申請記憶體 UE4記憶體管理 1

2021-10-12 09:14:33 字數 2265 閱讀 7209

ue4記憶體管理通過建立乙個全域性的管理器: gmalloc。在引擎初始化,第一次記憶體分配時,會呼叫以下方法:

其呼叫fplatformmemory的方法,fplatformmemory其實是乙個別名,其在不同的平台表示不同的型別,如下圖:

以android平台fandroidplatformmemory為例,看看baseallocator做了些什麼:

在arm64位下use_malloc_binned2為1,建立了fmallocbinned2物件。否則獲取系統的物理記憶體和頁大小建立fmallocbinned物件。可以發現在不同平台上,會根據不同的巨集控制,建立不同的記憶體管理物件,而ue在不同平台也提供了相應的命令列,供執行時調整記憶體管理物件,下圖展示了不同平台支援的記憶體管理型別:

不同記憶體管理型別,提供不同的功能,主要的管理型別功能為:

本文主要分析binned的實現

上一步中初始化好了記憶體分配器,那麼記憶體分配器是怎樣在引擎中使用起來的呢,ue首先複寫了全域性new/delete操作符,將其**到呼叫gmalloc->malloc和gmalloc->free。另一種是引擎的基礎結構,比如:tmap、tarray和tset等會直接呼叫gmalloc方法。我們以引擎中經常使用的tarray為例,當建立了乙個tarray並往裡面新增資料的時候,其呼叫鏈如下:

tarray::adduninitialized -> tarray::resizegrow -> fheapallocator::resizeallocation ->fmemory::realloc -> gmalloc::realloc

gmalloc就是上一步中建立的記憶體分配物件,當為fmallocbinned時,即最終呼叫了fmallocbinned::realloc,而fmallocbinned::realloc其實是呼叫了fmallocbinned::malloc,所以我們從fmallocbinned::malloc開始分析。

fmallocbinned記憶體管理,按照申請的記憶體大小,分為3種方式:

size < 32kb, 使用pooltable

size in [32kb, 48kb] 或者 size in [pagesize, 96kb],使用pagepooltable

其他使用系統分配

我們看第一種,fmallocbinned主要的思想是使用池子來管理記憶體,但並不是只分配乙個池子,ue將32kb的空間裡劃分了42個池子,每個池子管理記憶體的大小沒有特定規律,為什麼這樣劃分我們就不得而知了。

比如,申請一塊大小為10個位元組的記憶體,因為 8 < 10 < 16,就會使用第2個記憶體池,該池子的記憶體管理單元為16位元組,稱為該記憶體池的block為16位元組。所以申請一塊記憶體的第一步是確定使用哪個記憶體池,ue為了使這個過程夠快,使用了空間換時間的方法,提前建立了32kb的位址空間到相應記憶體池的對映。記憶體池即為pooltable。

上一步找到了對應記憶體大小的記憶體池後,會先判斷池裡是否存在空閒的pool,沒有的話就會分配乙個,而pool的大小,約為64kb(需滿足為block的整數倍且和記憶體頁對齊),仍然拿申請10位元組舉例,現在我們拿到了第2個pooltable,發現裡面並沒有pool,於是建立了乙個64kb的pool,因為第2個pooltable的block為16位元組,所以相當於我們建立了含有4kb個block的pool,其結構如下:

pool結構,每個block大小為16位元組

當申請10位元組時,只需返回乙個block即可,ue會從pool的後面向前開始分配,當乙個pool分配完畢(所有block均被使用)後,該pool即處於不可使用狀態,下次再申請時,會建立乙個新的pool,該記憶體池內所有的pool形成雙鏈的結構

在建立pool的時候,還會建立乙個hashtable,負責將位址對映到對應的pool,為什麼需要這樣乙個hashtable呢,考慮當需要釋放位址的時候,是需要釋放該位址對應記憶體池的block,而block是存在於pool中,所以有了這個hashtable就能在o1的時間找到需要釋放的block。

未完待續。。

ue4玻璃材質 UE4 材質

本文中,我們將首先討論基於物理的渲染,什麼是材質域,什麼是材質,什麼是材質例項,什麼是主材質,我們將討論材質的一些建議和禁忌。最後,我們將了解一些材質概念,你可以將其用於各類專案中的材質。pbr 表示基於物理的渲染,基於物理的渲染意味著我們根據現實模擬光線,而不是根據主觀想法模擬光線。光線的最終效果...

ue4材質節點大全 UE4 材質

凹凸貼圖偏移 bumpoffset 是虛幻引擎4術語,就是通常所謂的 視差貼圖 bumpoffset表示式可以使材質產生深度錯覺,而不需要額外的幾何體。深度資訊。高度貼圖的值越亮,材質的 凸出 效果越明顯 當攝像機在表面上移動時,這些區域將產生視差 位移 較遠 其位移程度最小。在不改變原有模型面數的...

malloc動態申請記憶體

1 malloc概述 malloc num 動態申請num位元組的記憶體空間,函式申請成功返回記憶體的起始位址 void型 申請不成功返回null指標,malloc不初始化記憶體空間 calloc type,num 函式會初始化申請的記憶體空間為0 使用完申請的記憶體後需要用free p 釋放記憶體...