Unreal Engine 4:学习笔记(二)内存管理和垃圾回收

说到unreal的内存管理和垃圾回收,自然要先了解什么对象需要被管理,怎样管理?对象用完后如何回收?
 

1.什么样的对象可以被unreal engine管理和回收:

unreal engine定义的类中,只有UObject或者是UObject的派生类创建的对象,才能被unreal engine管理,用完后才能被unreal engine回收。其它类比如:UStructs,不具有这个特性。

2.UObject或者是UObject的派生类的实例,创建和销毁的方式:

1).AActor类或者AActor派生类,虽然也是UObject的派生类,但创建和销毁方式不同于一般UObject的派生类:

AActor创建方式:

UWorld::SpawnActor()   //此方法创建Actor实例后,UWorld会持有Actor实例的引用

AActor销毁的方式:

AActor::Destroy()      //此方法会将Actor实例从关卡中删除,并将Actor实例标记为“待杀死”,然后会在下一次GC时删除

2).除AActor类或者AActor派生类以外的其它UObject或者是UObject的派生类:

UObject可通过如下4种方式创建:

NewObject<class>()
NewNamedObject<class>()
ConstructObject<class>()
new

UObject销毁方式:

UObject::MarkPendingKill()    //此方法执行后,所有指向此实例的指针将设置为NULL,并在下一次GC时删除

3.垃圾收集器如何管理UObject的实例

1).AActor类或者AActor派生类的实例被创建后,会自动存放在垃圾收集器的对象根集合中,不会被自动回收。

2).除AActor类或者AActor派生类以外的其它UObject或者是UObject的派生类的实例被创建后,会自动被回收,如果想不被GC回收,主要有如下几种方式:

2.1).创建的实例作为UObject的派生类的成员变量,并且被标记为UPROPERTY()

2.2).创建的实例存放在TArray中,TArray作为UObject的派生类的成员变量,并且被标记为UPROPERTY()

2.3).创建的实例存放在智能指针中。(此说法待验证)

2.4).通过UObject::AddToRoot(),设置RF_RootSet标志(可参考:UObject Instance Creation)。

 

参考文档:

Introduction to C++ Programming in UE4

Garbage Collection Overview

Garbage Collection & Dynamic Memory Allocation

Objects

Actors

Unreal Object Handling

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
    游戏引擎中之所以要做内存管理,一个是加快内存分配速度,另一个就是处理内存泄漏问题。     1.先简单说处理内存泄漏这个问题,一般的引擎在debug 模式下 都有一个记录内存分配的结构体,每分配一段内存就记录这段内存的信息,包括大小,分配时间,是否是数组,前后越界的标记等等吧,其实这些都不是那么重要,因为你只知道这些,一旦泄漏出现,你虽然知道泄漏,但无法定位。相反如果你知道堆栈的调用信息,就能准确定位。我以前的实现,在debug下,只记录当前调用new的时候的行号和文件,也就是内部的__FILE__ __LINE___.。我看了同事那个能记录堆栈调用过程,简直觉得很牛逼(其实不是调用堆栈,只是打印出调用过程,继续往下看你就知道了),以前自己也想过,但不知道怎么去实现。如果U3里面也加入这个功能,那就更牛叉了。思想很简单,就是核心东西在一个函数,这个是系统函数,提供当前这行指令所在的地址,它会打印出来这行指令的文件名和行号。先详细说下数据在内存的分配     最早的计算机数据段和代码段区分的很严格,现在似乎没有这么严格了!对于全局变量和静态变量它的分配完全在数据段分配,知道运行结束才会收回内存!而对于自动变量(包括函数参数和函数中定义的变量)则在堆栈中分配!一般的分配情形是这样的:从栈下到栈顶依次是函数参数,函数结束后下一条指令的地址,寄存器保护,然后是函数中定义的变量!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值