UObject 创建、销毁、内存管理、垃圾回收

目录

UObject的创建

NewObject

UObject的销毁

自动销毁

主动销毁

UObject::ConditionalBeginDestroy()

MarkPendingKill()

Engine\Config \BaseEngine.ini 更改下面参数,设置销毁时间间隔

强制垃圾回收

UObject对象内存管理

UPROPERTY() 保持引用

AddToRoot 和 RemoveFromRoot 标记不被GC/移除标记

AActor 销毁

UActorComponent


Garbage Collection Overview | Unreal Engine Community Wiki (unrealcommunity.wiki)

UObject实例创建 | 虚幻引擎5.0文档 (unrealengine.com)

UE4 UPROPERTY与反射、垃圾回收 - DullSword's Blog

虚幻Object处理 | 虚幻引擎文档 (unrealengine.com)

UE4中的C++编程简介 | 虚幻引擎文档 (unrealengine.com)

UObject的创建

NewObject

"NewObject()"是最简单的UObject工厂方法。它接受一个可选的外部对象和类,并用自动生成的名称创建一个新实例。

template< class T >
T* NewObject
(
    UObject* Outer=(UObject*)GetTransientPackage(),
    UClass* Class=T::StaticClass() 
)

指向指定类的生成实例指针。

  • 创建一个 UObject 类
UCLASS()
class TIPS_API UItemObject : public UObject
{
	GENERATED_BODY()
	FString m_Name;
public:
	UItemObject() { 
		m_Name = GetName();
		UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" %s"), *m_Name);
	}

	~UItemObject() { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__" %s"), *m_Name); }
};
  • 创建 UObject 实例
UItemObject* Obj = NewObject<UItemObject>();
UItemObject* Obj2 = NewObject<UItemObject>(this, TEXT("Obj2"));

UObject的销毁

自动销毁

UObject及其派生 具有被 UE4 垃圾回收机制管理,因而当指向对象的指针为 nullptr 后,将会被 UE4 自动回收掉

Obj = NewObject<UItemObject>(this, TEXT("Obj"));
Obj = nullptr;

主动销毁

UObject::ConditionalBeginDestroy()

  • 异步执行且对象在当前帧内持续有效
  • 等待下次GC
Obj->ConditionalBeginDestroy();
Obj = nullptr;

MarkPendingKill()

  • 标记为PendingKill,等待回收。指向此实例的指针将设置为NULL,并在下一次GC时删除。
  • IsPendingKill 判断是否处于 PendingKill 状态
  • ClearPendingKill 清除 PendingKill 状态
Obj->MarkPendingKill();
Obj = nullptr;

Engine\Config \BaseEngine.ini 更改下面参数,设置销毁时间间隔

gc.TimeBetweenPurgingPendingKillObjects=60

强制垃圾回收

  • UWorld::ForceGarbageCollection 弃用

  • GEngine->ForceGarbageCollection

GEngine->ForceGarbageCollection(true);

UObject对象内存管理

UPROPERTY() 保持引用

支持容器 TArray、TMap 的 <UObject*>类型。TArray、TMap使用UPROPERTY() ,也可以使元素对象常驻内存

UPROPERTY()
	class UItemObject* m_ItemObject2;

UPROPERTY()
	TArray<class UItemObject*> m_ObjList1;

AddToRoot 和 RemoveFromRoot 标记不被GC/移除标记

  • 构造时 和 AddToRoot 一起

  • 析构时和 RemveFromRoot 一起

//创建对象
m_ItemObject1 = NewObject<UItemObject>(this,TEXT("m_ItemObject1"));
m_ItemObject1->AddToRoot();

// 释放对象
m_ItemObject1->RemoveFromRoot();
m_ItemObject1 = nullptr;

AActor 销毁

  • Destroy() 方法

UActorComponent

  • DestroyComponent() 方法
  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值