乐趣区

关于垃圾回收:UE4-垃圾回收

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 学堂收费查看。

退出移动版