渲染线程需要访问的材质已经被主线程释放

我们在开启ASAN对PC包的内存进行分析,启动游戏的时候,报告了如下问题,想知道EPIC是否在更高版本解决了此类问题,有没有相关P4 CL号或者GITHUB Commit能够提供,让我们尝试修复。

时间线分析:

  1. 线程 T131(异步加载线程)创建了材质对象(0x11f7d4208580)
  2. 线程 T0(主线程)在垃圾回收时释放了该对象
  3. 线程 T68(渲染线程)尝试访问已被释放的材质对象

具体调用栈:

释放栈(T0 - 主线程):

  • 垃圾回收过程中调用 IncrementalPurgeGarbage
  • 最终在 FAsyncPurge::TickDestroyGameThreadObjects中释放对象

使用栈(T68 - 渲染线程):

  • 在场景渲染更新时调用 FScene::Update
  • 通过材质代理更新延迟缓存的 uniform 表达式
  • 最终在 FDefaultMaterialInstance::GetMaterialNoFallback访问已释放内存

<br/>

Hi,

有可能gc的IncrementalBeginDestroy有关系,你可以设置一下gc.IncrementalBeginDestroyEnabled=0,看看是否还有问题。

好的。我将重新出包测试。请问如果项目关闭这个选项。会带来性能问题吗?

Hi,我觉得应该不会有明显的性能问题,但是这个开着的确我们发现一些情况是主线程的资源已经释放了,渲染线程仍然在使用的情况。所以关了会比较安全。