当前位置: 首页 > news >正文

UE 5.3 C++ 对垃圾回收的初步认识

一.UObject的创建

UObject 不支持构造参数。

所有的C++ UObject都会在引擎启动的时候初始化,然后引擎会调用其默认构造器。如果没有默认的构造器,那么 UObject 将不会编译。

有修改父类参数的需求,就使用指定带参构造

	// Sets default values for this actor's propertiesAMyActor();// AMyActor(const FObjectInitializer& ObjectInitializer);

创建

1. NewObject<T>();

虚幻会管理,它重载了new 和 delete。

	myObject =  NewObject<UBaseObject>();

2.     CreateDefaultSubobject<T>();

RootComponent = CreateDefaultSubobject<USceneComponent>("Root");

只是上一个更通用,下面这个在构造函数里才使用,来创建和管理组件。

二.测试垃圾回收

在你Actor的头文件的中,声明一个UObject·。

UCLASS()
class MYPROJECT_API UBaseObject :public UObject
{GENERATED_BODY()
public:UBaseObject();UBaseObject(const FObjectInitializer& ObjectInitializer);virtual ~UBaseObject();int32 Health = 666;
};

并在Actor里声明它。

public:	// Called every framevirtual void Tick(float DeltaTime) override;UFUNCTION(BlueprintCallable)void InitBaseObject();UFUNCTION(BlueprintCallable)int32 GetBaseObjectHealth();//为了避免对象被回收//UPROPERTY()  //有对象引用了,就不会被回收UBaseObject* myObject = nullptr;
};

CPP里实现

void AMyActor::InitBaseObject()
{myObject =  NewObject<UBaseObject>();myObject->AddToRoot();
}int32 AMyActor::GetBaseObjectHealth()
{if (myObject){return myObject->Health;}return -1;
}UBaseObject::UBaseObject()
{UE_LOG(LogTemp, Warning, TEXT("初始化了"));}UBaseObject::UBaseObject(const FObjectInitializer& ObjectInitializer)
{UE_LOG(LogTemp, Warning, TEXT("初始化了2"));
}UBaseObject::~UBaseObject()
{UE_LOG(LogTemp, Warning, TEXT("垃圾回收"));
}

测试

一旦按下3,垃圾回收。自己的UObject就会被回收掉。

解决方案,加上UPOPERTY,让它被对象引用。

	//为了避免对象被回收UPROPERTY()  //有对象引用了,就不会被回收UBaseObject* myObject = nullptr;

AddtoRoot,强制不被回收。和允许回收。少用这个方法。

void AMyActor::InitBaseObject()
{myObject =  NewObject<UBaseObject>();myObject->AddToRoot();
}

注:标记UPROPERTY 会自动加入root set 阻止垃圾回收

一个Up标记object类指针变量,当指向null时,object会进行析构,自动进行垃圾回收

一个非标记的object类变量,当未添加AddToRoot时,会被下一次垃圾回收,留下野指针。

你通常需要保持对希望保持活跃的任何Object的`UPROPERTY`引用,或者将指向它的指针存储在`TArray`或其他引擎容器类中。

http://www.lryc.cn/news/530150.html

相关文章:

  • ARM内核:嵌入式时代的核心引擎
  • 需求分析应该从哪些方面来着手做?
  • 【Unity2D 2022:C#Script】DoTween插件的使用
  • 【Docker】ubuntu中 Docker的使用
  • 【数据结构篇】时间复杂度
  • linux 环境安装 dlib 的 gpu 版本
  • springboot集成钉钉,发送钉钉日报
  • 【机器学习】自定义数据集 使用scikit-learn中svm的包实现svm分类
  • 快速提升网站收录:利用网站历史数据
  • 【Git】初识Git Git基本操作详解
  • Python NumPy(11):NumPy 排序、条件筛选函数
  • AJAX综合案例——图书管理
  • JDK自带工具解析与生产问题定位指南(一)
  • FPGA 使用 CLOCK_DEDICATED_ROUTE 约束
  • 《解锁AI黑科技:数据分类聚类与可视化》
  • Java小白入门教程:Object
  • 记6(人工神经网络
  • stm32硬件实现与w25qxx通信
  • 编程题-最接近的三数之和
  • 索引的底层数据结构、B+树的结构、为什么InnoDB使用B+树而不是B树呢
  • 【工欲善其事】利用 DeepSeek 实现复杂 Git 操作:从原项目剥离出子版本树并同步到新的代码库中
  • 网络编程套接字(中)
  • 前端学习-事件委托(三十)
  • 线程池以及在QT中的接口使用
  • c语言操作符(详细讲解)
  • 【自然语言处理(NLP)】深度学习架构:Transformer 原理及代码实现
  • JavaScript 入门教程
  • 浅析CDN安全策略防范
  • 代码随想录刷题day22|(字符串篇)344.反转字符串、541.反转字符串 II
  • python学opencv|读取图像(五十三)原理探索:使用cv.matchTemplate()函数实现最佳图像匹配