UE4 垃圾回收


UE4引擎為我們搭建了一套UObject對象系統,並且加入了垃圾回收機制,使我們用C++進行游戲開發時更加方便,而且游戲本身也可以極大程度地避免內存泄漏問題。 

UE4引擎采用了標記-清掃垃圾回收方式,是一種經典的垃圾回收方式。一次垃圾回收分為兩個階段:第一階段從一個根集合出發,遍歷所有可達對象,遍歷完成后就能標記出可達對象和不可達對象了,這個階段會在一幀內完成;第二階段會漸進式地清理這些不可達對象,因為不可達的對象將永遠不能被訪問到,所以可以分幀清理它們,避免一下子清理很多UObject。比如,Map卸載時就會發生明顯的卡頓。

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

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

下圖為標記-清掃的工作原理:

  

 


 

1.1 GC何時進行

UE4引擎中GC可以分為主動引發自動引發兩種方式。

 

1.1.1 主動引發

可以在執行一些操作時手動調用GC。比如,卸載一個資源后,立即調用一次GC進行清理。

游戲中可以調用ForceGarbageCollection來讓World下次Tick時進行垃圾回收,也可以直接調用CollectGarbage進行垃圾回收(引擎中大部分情況都用這種方式主動引發)。

 

1.1.2 自動引發

游戲中,大部分的垃圾回收操作都是由UE4引擎自動引發的,普通情況下不需要手動調用GC,這也是理想的GC使用方式。

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

 

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM