UE4 垃圾回收

UE4引擎采用标记-清扫的垃圾回收策略,通过主动和自动触发的方式管理UObject对象,防止内存泄漏。游戏线程上执行GC,支持多线程,并可通过参数配置GC行为。当UObject数量超过预设阈值时,游戏会崩溃。开发者可以手动调用GC进行清理,或者依赖引擎自动判断执行。
摘要由CSDN通过智能技术生成

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值