UE4 垃圾回收

UE4引擎爲咱們搭建了一套UObject對象系統,而且加入了垃圾回收機制,使咱們用C++進行遊戲開發時更加方便,並且遊戲自己也能夠極大程度地避免內存泄漏問題。多線程

UE4引擎採用了標記-清掃垃圾回收方式,是一種經典的垃圾回收方式。一次垃圾回收分爲兩個階段:第一階段從一個根集合出發,遍歷全部可達對象,遍歷完成後就能標記出可達對象和不可達對象了,這個階段會在一幀內完成;第二階段會漸進式地清理這些不可達對象,由於不可達的對象將永遠不能被訪問到,因此能夠分幀清理它們,避免一會兒清理不少UObject。好比,Map卸載時就會發生明顯的卡頓。編輯器

GC發生在遊戲線程上,對UObject進行清理,支持多線程GC。函數

對GC能夠設置若干參數,好比MaxObjectsInGame,規定了遊戲中最大存在的UObject對象(對編輯器不生效),移動平臺上默認設置了131072。當UObject數量超過這個閾值時,遊戲會崩潰,其餘詳細參數可見UGarbageCollectionSettings、GarbageCollection.cpp和UnrealEngine.cpp中相關的屬性。spa

下圖爲標記-清掃的工做原理:線程

 


 

1.1 GC什麼時候進行

 

UE4引擎中GC能夠分爲主動引起自動引起兩種方式。對象

 

1.1.1 主動引起blog

能夠在執行一些操做時手動調用GC。好比,卸載一個資源後,當即調用一次GC進行清理。遊戲

遊戲中能夠調用ForceGarbageCollection來讓World下次Tick時進行垃圾回收,也能夠直接調用CollectGarbage進行垃圾回收(引擎中大部分狀況都用這種方式主動引起)。內存

 

1.1.2 自動引起資源

遊戲中,大部分的垃圾回收操做都是由UE4引擎自動引起的,普通狀況下不須要手動調用GC,這也是理想的GC使用方式。

當World進行Tick時,會調用UEngine::ConditionalCollectGarbage()函數,函數中進行了一些判斷,當知足GC條件時,纔會執行GC。下面分析一下ConditionalCollectGarbage的執行邏輯。

 

UE4 GC流程 和 清理流程 可前往UWA學堂免費查看。

相關文章
相關標籤/搜索