UE4引擎为咱们搭建了一套UObject对象零碎,并且退出了垃圾回收机制,使咱们用C++进行游戏开发时更加不便,而且游戏自身也能够极大水平地防止内存透露问题。

UE4引擎采纳了标记-打扫垃圾回收形式,是一种经典的垃圾回收形式。一次垃圾回收分为两个阶段:第一阶段从一个根汇合登程,遍历所有可达对象,遍历实现后就能标记出可达对象和不可达对象了,这个阶段会在一帧内实现;第二阶段会渐进式地清理这些不可达对象,因为不可达的对象将永远不能被拜访到,所以能够分帧清理它们,防止一下子清理很多UObject。比方,Map卸载时就会产生显著的卡顿。

GC产生在游戏线程上,对UObject进行清理,反对多线程GC。

对GC能够设置若干参数,比方MaxObjectsInGame,规定了游戏中最大存在的UObject对象(对编辑器不失效),挪动平台上默认设置了131072。当UObject数量超过这个阈值时,游戏会解体,其余具体参数可见UGarbageCollectionSettings、GarbageCollection.cpp和UnrealEngine.cpp中相干的属性。

下图为标记-打扫的工作原理:


1.1 GC何时进行

UE4引擎中GC能够分为被动引发主动引发两种形式。

1.1.1 被动引发

能够在执行一些操作时手动调用GC。比方,卸载一个资源后,立刻调用一次GC进行清理。

游戏中能够调用ForceGarbageCollection来让World下次Tick时进行垃圾回收,也能够间接调用CollectGarbage进行垃圾回收(引擎中大部分状况都用这种形式被动引发)。

1.1.2 主动引发

游戏中,大部分的垃圾回收操作都是由UE4引擎主动引发的,一般状况下不须要手动调用GC,这也是现实的GC应用形式。

当World进行Tick时,会调用UEngine::ConditionalCollectGarbage()函数,函数中进行了一些判断,当满足GC条件时,才会执行GC。上面剖析一下ConditionalCollectGarbage的执行逻辑。

UE4 GC流程 和 清理流程 可返回UWA学堂收费查看。