texture streaming的过程中在FDynamicRenderAssetInstanceManager遍历primcomp触发崩溃

我们游戏在加载大世界关卡的过程中,崩溃在texture streaming里,疑似是相关联的primitivecomponent已经被释放了。请问有什么修复的建议?

[Image Removed]

重现步骤

Hi,

我大概看了一下这里代码,这里处理PendingComponents的逻辑这两个版本没什么大的变化,正常在GC前,会走到FDynamicRenderAssetInstanceManager.OnPreGarbageCollect,如果这个Component会在接下来的GC里被Destroy,理论上应该会被从这个列表里去掉。

另外在PrimitiveComponent的OnUnregister的时候,也会主动通知到FRenderAssetStreamingManager.NotifyPrimitiveDetached,把这个Component从列表里去除。

所以我暂时没看出来可能是哪里的问题。可以试试Dev版复现问题,看看崩溃的堆栈是否有更明显的提示。

目前只有shiping包才会出现这个问题。不知是否跟gc.IncrementalBeginDestroyEnabled有关系

如果没关掉话,最好关掉再测试一下。

我们发现FDynamicRenderAssetInstanceManager::Add是有可能在异步线程调用的,比如NotifyPrimitiveUpdated_Concurrent可能会从World的SendAllEndOfFrameUpdates的

ParallelWork调用,这样PendingComponents就有在遍历的时候有其他线程写入的风险,这里是不是需要加个锁?

这里应该已经有锁了。而且这里应该也不会造成前面的崩溃。崩溃的条件应该是GC造成了component无效,但是又没有从PendingComponents里移除,我暂时没有看出这种问题的可能性。

[Image Removed]