ue4 内存管理 – 实践(废弃)

来源:互联网 发布:电信80端口备案 编辑:程序博客网 时间:2024/05/12 11:35

:roll: UObject、UActorComponent的gc机制

此文废弃,请参考:http://blog.csdn.net/yangxuan0261/article/details/52075581

UObject gc机制

1)TArray保持引用

如果有个TArray容器,则这个TArray需要用一个UPROPERTY()去保持容器的引用,然后里面的UObject就不需要再去AddToRoot去阻止被gc了。

 

C++
1
2
3
4
5
6
    UPROPERTY(EditAnywhere,BlueprintReadWrite,Category= "UCoolDownComponent")
        TArray<UCoolDown*>     mCDArr;
 
    UCoolDown*cd= NewObject<UCoolDown>(_class);
    cd->SetSkillId(_skillId);
    mCDArr.Add(cd);

 

容器clear后,元素会自动被gc

2)TMap不能保持引用

所以为安全起见,任何时候,不管是TArray还是TMap,元素都AddToRoot一下,需要删除的时候就RemoveFromRoot

3)没有任何容器保持引用

需要AddToRoot添加标记去阻止被gc

C++
1
2
                m_sInstance = NewObject<T>();
                m_sInstance->AddToRoot();

 

同时需要移除标记

 

C++
1
2
            m_sInstance->RemoveFromRoot();
            m_sInstance = nullptr;

UActorComponent gc机制

1)依附于一个宿主Actor,销毁Actor则UActorComponent坐等被gc

一般一个组件都是依附在一个actor中,所以创建需要添加一个宿主Outer的引用,然后注册一下,当宿主销毁的时候,组件的宿主引用就无效了,会在一个不定时的时间被gc掉

C++
1
2
    UPROPERTY(EditAnywhere,BlueprintReadWrite,Category= "MyChar")
        UCoolDownComponent*    mCDComp;

//注册cd组件

 

C++
1
2
    mCDComp = NewObject<UCoolDownComponent>(this,TEXT("CDComponent"));
    mCDComp->RegisterComponent();

 

2)任意时刻销毁,即使宿主Actor未被销毁

C++销毁则直接调用接口

C++
1
void UActorComponent::DestroyComponent(boolbPromoteChildren/*= false*/)

蓝图销毁,需要设置一个UActorComponent的属性

C++
1
bAllowAnyoneToDestroyMe=true;

因为提供给蓝图的接口需要判断这个字段,默认是false

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
UFUNCTION(BlueprintCallable,Category="Components",meta=(Keywords="Delete",HidePin="Object",DefaultToSelf="Object",DisplayName= "DestroyComponent"))
void K2_DestroyComponent(UObject*Object);
 
void UActorComponent::K2_DestroyComponent(UObject*Object)
{
AActor*MyOwner= GetOwner();
if (bAllowAnyoneToDestroyMe||Object == this || MyOwner == NULL || MyOwner == Object)
{
DestroyComponent();
}
else
{
// TODO: Put in Message Log
UE_LOG(LogActorComponent,Error,TEXT("May not destroy component %s owned by %s."),*GetFullName(),*MyOwner->GetFullName());
}
}

 

3)一般重写这两个函数,替代构造和析构函数

C++
1
2
3
4
// Begin UActorComponent Interface.
virtual voidBeginPlay()override;//组件被new的时候立即调用
virtual voidBeginDestroy()override;//引擎在gc的时候调用,并不是立即调用
// End UActorComponent Interface.
默认的gc是时间测试得到为1min
0 0