unreal engine 学习笔记(二):内存管理和垃圾回收

说到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

猜你喜欢

转载自blog.csdn.net/netyeaxi/article/details/80882781
今日推荐