关于DestoryComponent崩溃问题

发表于2018-03-11
评论0 3.1k浏览
前段时间写了一个方便配置各种特效,音效的StaticMeshActor的工具,其中生成特效时候使用到了SpawnEmitterAtLocation函数,在处理一些永久特效延迟一定时间销毁时候使用了DestoryComponent函数,因为这个暴露出来了一个问题。程序会有一定几率崩溃在DestoryComponent函数里面,但是也不是必现的,这时候就有些蛋疼了。

后来发现其实这里是有一个误区的,先看SpawnEmitterAtLocation的函数原型:
static UParticleSystemComponent* SpawnEmitterAtLocation(const UObject* WorldContextObject, class UParticleSystem* EmitterTemplate, FVector Location, FRotator Rotation = FRotator::ZeroRotator, bool bAutoDestroy = true)  

这个函数的最后一个参数bAutoDestroy是有默认值的,默认为true。@param bAutoDestroy - Whether the component will automatically be destroyed when the particle system completes playing or whether it can be reactivated。也就是说它默认为如果粒子特效播放完毕,就会自动销毁。这时候我们认为它销毁了,但是其实如果没有经过GC的话,它那块存储空间依然存在,仍然可以通过指针继续正常调用它,这就给了我们一个误区,误以为其实最后一个参数bAutoDestroy是没有实际作用的。

暴露出来这个问题其实也是因为在使用时候误把一个有生存周期的粒子当成永久粒子使用了,然后如果在定时器回调过去销毁这个粒子时候,经过了GC的话,它就会因为内存问题直接崩溃,假如没有经过GC,就不会有任何问题,这是给我们造成一个误区的基本。左后再给大家简单解释下虚幻4的GC。

GC就是指垃圾回收系统,虚幻4引擎使用反射系统(机制)去实现垃圾回收。关于垃圾回收,你不用进行手动的去销毁你的UObjects类对象,一般来讲GC的时间是不定时的,大概1分钟一次左右,当然也可以通过手动强制调用。

如社区发表内容存在侵权行为,您可以点击这里查看侵权投诉指引