UObject 的创建

NewObject 模板类

  • 本例使用 UE 4.26,只剩下 NewObject 用来创建 UObject,提供两个带不同可选参数构造函数的模板类

  • Outer 表示这个对象的外部对象,通常可传 this 指针进去

  • Name 为对象名,如果没有自定义,默认生成,自带 GetName() 方法获取

    template<class T>
    T* NewObject(UObject* Outer)
    {
    T* Object = ::NewObject<T>(Outer);
    Object->SetInternalFlags(EInternalObjectFlags::Async);
    return Object;
    } template<class T>
    T* NewObject(UObject* Outer, UClass* Class, FName Name = NAME_None,
    EObjectFlags Flags = RF_NoFlags, UObject* Template = nullptr,
    bool bCopyTransientsFromClassDefaults = false, FObjectInstancingGraph* InInstanceGraph = nullptr)
    {
    T* Object = ::NewObject<T>(Outer, Class, Name, Flags, Template, bCopyTransientsFromClassDefaults, InInstanceGraph);
    Object->SetInternalFlags(EInternalObjectFlags::Async);
    return Object;
    }

实践

  • 创建一个 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);

原生对象内存管理

new/delete

  • 需要手动清理,易造成内存泄漏

  • delete 一般将指针置为 nullptr ,防止指向的地址不固定

    class SimpleObject {
    public:
    SimpleObject() { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__)); }
    ~SimpleObject() { UE_LOG(LogTemp, Warning, TEXT(__FUNCTION__)); }
    };
    SimpleObject* Obj = new SimpleObject();
    
    delete Obj;
    Obj = nullptr;

使用智能指针

  • 对于非 UObject 的对象,可以使用智能指针进行管理
  • 当引用计数为0时,对象自动销毁

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;

FStreamableManager 资源卸载

  • FStreamableHandle::ReleaseHandle()

    TSharedPtr<FStreamableHandle> Handle  = UAssetManager::GetStreamableManager().RequestSyncLoad(AssetPath);
    UObject* Obj = Handle->GetLoadedAsset();
    Handle->ReleaseHandle();

AActor 销毁

  • Destroy() 方法

UActorComponent

  • DestroyComponent() 方法

扩展:FGCObjectScopeGuard

【UE4 C++】UObject 创建、销毁、内存管理的更多相关文章

  1. UIView的创建与内存管理

    学习过程中遇到一些问题,现在记录下来,以后忘记以便翻看. 创建工程的步骤: xcode的ARC改为MRC .h文件中的strong改为retain .m文件中加入dealloc方法 .m文件中_win ...

  2. 关于Image创建的内存管理

    image创建方法 [UIImage imageNamed:imageName] 上述方法创建的image,会常驻在内存中,不会随着imageView的dealloc而释放内存. NSString * ...

  3. Object-c 内存管理

                    内存管理 主要内容 1.内存管理的概念 2.引用计数 3.如何持有对象所有权 4.自动释放池 5.@property的使用 什么是内存管理 内存管理是关于如何管理对象生 ...

  4. nginx源码分析—内存池结构ngx_pool_t及内存管理

    Content 0. 序 1. 内存池结构 1.1 ngx_pool_t结构 1.2 其他相关结构 1.3 ngx_pool_t的逻辑结构 2. 内存池操作 2.1 创建内存池 2.2 销毁内存池 2 ...

  5. TaskTracker节点上的内存管理器

    Hadoop平台的最大优势就是充分地利用了廉价的PC机,这也就使得集群中的工作节点存在一个重要的问题——节点所在的PC机内存资源有限(这里所说的工作节点指的是TaskTracker节点),执行任务时常 ...

  6. 内存管理运算符new delete与内存管理函数malloc free的区别——已经他们对对象创建的过程。

    (1)内存管理函数与内存管理运算符的区别 内存管理函数有内存分配函数,malloc calloc realloc 以及内存释放函数free. 内存管理运算符有new 和delete. 两种内存管理方式 ...

  7. BBS项目详解(forms快速创建登陆页面,登陆验证、通过阅读器进行头像上传的预览、内存管理器)

    BBS项目涉及的知识点 django中知识点 钩子函数(局部钩子和全局钩子) 1.局部钩子就是用来做合法性校验,比如用户名有没有被使用等 2.全局的就是用来做对比校验,比如两次输入的密码是否一致 3. ...

  8. 使用虚幻引擎中的C++导论(四-内存管理与垃圾回收)(终)

    使用虚幻引擎中的C++导论(四)(终) 第一,这篇是我翻译的虚幻4官网的新手编程教程,原文传送门,有的翻译不太好,但大体意思差不多,请支持我O(∩_∩)O谢谢. 第二,某些细节操作,这篇文章省略了,如 ...

  9. Objective-C内存管理之引用计数

    初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...

随机推荐

  1. mybaits源码分析--binding模块(五)

    一.binding模块 接下来我们看看在org.apache.ibatis.binding包下提供的Binding模块 ,binding其实在执行sqlSession.getMapper(UserMa ...

  2. 性能测试工具JMeter 基础(九)—— 测试元件: 逻辑控制器之交替控制器

    交替控制器:根据被控制器触发执行次数,去依次执行控制器下的子节点(逻辑控制器.采样器),可以由线程组的线程数.循环次数.逻辑控制器触发. 交替控制器(lnterleave Controller) 简单 ...

  3. Linux下Sed命令替换文件中的所有IP

    命令: sed -ri 's/([0-9]{1,3}\.){3}[0-9]{1,3}/localhost/g' es_create_index.sh 如图:

  4. NOIP模拟13「工业题·卡常题·玄学题」

    T1:工业题 基本思路   这题有一个重要的小转化: 我们将原来的函数看作一个矩阵,\(f(i,j-1)*a\)相当于从\(j-1\)向右走一步并贡献a,\(f(i-1,j)*b\)相当于从\(i-1 ...

  5. openwrt开发笔记三:uci移植及API调用

    1.uci编译安装.移植 安装依赖 libubox #安装cmake sudo apt-get install cmake #下载依赖库libubox git clone http://git.nbd ...

  6. 这篇 Java 基础,我吹不动了

    Hey guys,这里是程序员cxuan,欢迎你收看我最新一期的文章,这篇文章我补充了一些关于<Java基础核心总结>的内容,修改了部分错别字和语句不通顺的地方,并且对内部类.泛型等内容进 ...

  7. 转:C#根据条件设置datagridview行的颜色

    1 private void LoadData() 2 { 3 DataTable tblDatas = new DataTable(); 4 tblDatas.Columns.Add("I ...

  8. clion结合vcpkg以及GTest的使用

    目录 一.vcpkg简介.下载和使用 1. vcpkg是什么 2. vcpkg下载 3. 使用vcpkg下载第三方库 二.clion结合vcpkg 1. 方法一:使用环境变量 2. 方法二:添加cma ...

  9. Spring Boot中使用@Async的时候,千万别忘了线程池的配置!

    上一篇我们介绍了如何使用@Async注解来创建异步任务,我可以用这种方法来实现一些并发操作,以加速任务的执行效率.但是,如果只是如前文那样直接简单的创建来使用,可能还是会碰到一些问题.存在有什么问题呢 ...

  10. FastDFS 配置 Nginx 模块及访问测试

    #备注:以下nginx-1.10.3源码目录根据nginx版本号不同会有相应的变化,以nginx版本号为准#一.安装 Nginx 和 fastdfs-nginx-module1,安装 Nginx 请看 ...