我们游戏在加载大世界关卡的过程中,崩溃在texture streaming里,疑似是相关联的primitivecomponent已经被释放了。请问有什么修复的建议?
[Image Removed]
我们游戏在加载大世界关卡的过程中,崩溃在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]