我们在升级UE5.5有遇到过场景切换时候的旧场景泄露断言的命中

咨询个问题,我们在升级UE5.5有遇到过场景切换时候的旧场景泄露断言的命中

CheckAndHandleStaleWorldObjectReferences

开了gcHistory后排查到是因为有StrongObjectPtr的引用导致World需要两次GC才不可达

[Image Removed]

指针的支持持有者是Sequence

[Image Removed]

第一次GC能够释放掉这个StrongObjectPtr引用的内容,第二次GC就可以把泄露的World释放掉

[Image Removed]

我们现在除了两次GC好像没有更好的解决办法了,UE本身的逻辑会在编辑器下做两次GC也是为了解决这种问题吗

[Image Removed]

另外我们查到这个GC代码是14年就有的,所以怀疑是UE5的Garbage跟UE4的PendingKill机制不一样导致的,这两个机制有什么区别吗

Hi,

不好意思,我暂时没有理清楚报错的原因,能否把完整的log上传上来,当然最好是能提供一个简单的复现工程。

从代码上看,应该是CheckAndHandleStaleWorldObjectReferences里LeakedObjects不为空,我暂时没有看出来LeakedObjects是从哪来的。

我们先试下公版复现下,其实我们怀疑是UE5的Garbage跟UE4的PendingKill机制不一样导致的,目前看起来Gargabe的东西不一定会在一次GC中被清除,这两个机制有什么区别吗

ue5的确对pendingKill做了改动,由于​pendingKill会将对象的强引用改成弱引用,并在下次垃圾回收时将其置空,因此比较危险,尽管在ue5中仍然支持PendingKill,但所有对PendingKill的函数已经被移除,Obj->IsPendingKill()的调用已被替换为 IsValid(Obj)、IsValidChecked(Obj)或 GetValid(Obj),Obj->IsPendingKillOrUnreachable()的调用也被替换为 IsValid*函数,Obj->MarkPendingKill() 和 Obj->ClearPendingKill() 已分别被 Obj->MarkAsGarbage() 和 Obj->ClearGarbage() 替换。这两组函数的区别在于后者仅将对象标记为“Garbage”,GC不会尝试将其引用置为空。