UE4常驻内存

2019-06-24  本文已影响0人  我真的不知道该起什么名字了

转自:https://dawnarc.com/2017/04/ue4%E5%AF%B9%E8%B1%A1%E7%9A%84%E5%9E%83%E5%9C%BE%E5%9B%9E%E6%94%B6%E4%B8%8E%E5%86%85%E5%AD%98%E5%B8%B8%E9%A9%BB/

防止GC的办法

一个UObject类型的变量,即使是static,默认也会被GC掉。

要防止该对象被GC,有4种方式:

Uobject不能使用TSharedPtr进行引用计数,非UObject才可以;如果一个非UObject的类想加入GC,那么必须继承FGCObject类。

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
}

GC 常见问题
  1. 官方论坛上有人说 NewObject() 或者 LoadObject() 创建的对象才会自动被 GC , SpawnActor 创建的对象会被自动 AddToRoot ,不会被 GC。不知早期的版本是否确实如此,但是目前版本不是这样,即使是 SpawnActor ,默认也会被 GC。
参考资料

虚幻4垃圾回收剖析
http://www.cnblogs.com/ghl_carmack/p/6112118.html

转载:UE4内存管理 – 实践
http://blog.csdn.net/yangxuan0261/article/details/52075581

原文内容如下:

UObject gc机制

AActor gc机制

一般重写这两个函数,来做一些初始化和清理工作

virtual void PostActorCreated() override; //做初始化工作
virtual void BeginPlay() override; //做初始化工作
virtual void BeginDestroy() override; //引擎在gc的时候调用,并不是立即调用,一般不用
virtual void EndPlay(const EEndPlayReason::Type EndPlayReason) override; //做清理工作
virtual void Destroyed() override; //用于释放成员,调用Destroy();会立即调用

调用SpawnActor或DestroyActor会调用到这两个函数,析构函数则要在gc的时候才会调用,可以调用gc函数测试一下

GWorld->GetWorld()->ForceGarbageCollection(true);

UActorComponent gc机制

上一篇 下一篇

猜你喜欢

热点阅读