UE4 内存管理

UObject gc机制

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

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "UCoolDownComponent")
        TArray<UCoolDown*>      mCDArr;

    UCoolDown* cd = NewObject<UCoolDown>(_class);
    cd->SetSkillId(_skillId);
    mCDArr.Add(cd);
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

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

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

3)没有任何容器保持引用需要AddToRoot添加标记去阻止被gc

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

同时需要移除标记

            m_sInstance->RemoveFromRoot();
            m_sInstance = nullptr;
 
 
  • 1
  • 2

UActorComponent gc机制

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

    UPROPERTY(EditAnywhere, BlueprintReadWrite, Category = "MyChar")
        UCoolDownComponent*     mCDComp;
//注册cd组件
 
 
  • 1
  • 2
  • 3
    mCDComp = NewObject<UCoolDownComponent>(this, TEXT("CDComponent"));
    mCDComp->RegisterComponent();
 
 
  • 1
  • 2

2)任意时刻销毁,即使宿主Actor未被销毁C++销毁则直接调用接口 
void UActorComponent::DestroyComponent(bool bPromoteChildren/*= false*/) 
蓝图销毁,需要设置一个UActorComponent的属性 
bAllowAnyoneToDestroyMe = true; 
因为提供给蓝图的接口需要判断这个字段,默认是false

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());
}
}
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

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

// Begin UActorComponent Interface.
virtual void BeginPlay() override; //组件被new的时候立即调用
virtual void BeginDestroy() override; //引擎在gc的时候调用,并不是立即调用
// End UActorComponent Interface.
 
 
  • 1
  • 2
  • 3
  • 4

默认的gc是时间测试得到为1min

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值