[UE4]對象內存常駐的四種方式
來自專欄虛幻引擎9 人贊了文章
keywords:UE4, Memory Persist, GC, 垃圾回收, 內存管理
防止GC的辦法
要防止對象被GC,有4種方式:
- 作為成員變數並標記為
UPROPERTY()
; - 創建對象後
AddToRoot()
;(退出遊戲時需要RemoveFromRoot()
) - FStreamableManager Load資源時,
bManageActiveHandle
設置為true; FGCObjectScopeGuard
在指定代碼區域內保持對象;
注意:
一個UObject類型的變數,即使是static,默認也會被GC掉。
UPROPERTY()用法
URPOPERTY() UObject* MyObj;
AddToRoot()用法
UMyObject* MyObj = NewObject<UMyObject>();MyObj.AddToRoot();
FStreamableManager 用法
FSoftObjectPath AssetPath(TEXT("/Game/Mannequin/Animations/ThirdPersonWalk.ThirdPersonWalk"));FStreamableManager& AssetLoader = UAssetManager::GetStreamableManager();//hold object in memory.TSharedPtr<FStreamableHandle> Handle = AssetLoader.RequestSyncLoad(AssetPath, true);UObject* Obj = Handle->GetLoadedAsset();//free memory of object.Handle->ReleaseHandle();
FGCObjectScopeGuard 用法
{ FGCObjectScopeGuard(UObject* GladOS = NewObject<...>(...)); GladOS->SpawnCell(); RunGC(); GladOS->IsStillAlive(); // Object will not be removed by GC}
注意事項:
Uobject不能使用TSharedPtr進行引用計數,如果一個非UObject的類想加入GC,那麼必須繼承FGCObject類。(感謝 知乎用戶的指正~)
參考資料
虛幻4垃圾回收剖析
http://www.cnblogs.com/ghl_carmack/p/6112118.htmlUE4內存管理 – 實踐
http://blog.csdn.net/yangxuan0261/article/details/52075581推薦閱讀:
※真良心大廠EPIC,頁游廣告又有新素材了!
※Begin ray marching in unreal engine 4【第五卷:使用偽3D體紋理渲染雲】
※[UE4]動畫藍圖的編輯全流程(Animation Blueprint)
※[UE4]Generate Visual Studio工程時如何指定VS版本