材质实例被GC导致FMaterialRenderProxy::CacheUniformExpressions崩溃的问题

偶尔触发的崩溃,堆栈如下

[2025.09.08-17.22.54:373][451]LogWindows: Error: Fatal error: [File:E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\Engine\Private\Materials\MaterialRenderProxy.cpp] [Line: 514]

[2025.09.08-17.22.54:373][451]LogWindows: Error: Cannot queue the Expression Cache for Material MID_Post_Process_Wind_Fog_34 when it is about to be deleted

[2025.09.08-17.22.54:373][451]LogWindows: Error:

[2025.09.08-17.22.54:373][451]LogWindows: Error:

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff67227ca69 Rhea.exe!FMaterialRenderProxy::CacheUniformExpressions() [E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\Engine\Private\Materials\MaterialRenderProxy.cpp:516]

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff66ff86bc1 Rhea.exe!`FRenderThreadCommandPipe::EnqueueAndLaunch’::`5’::<lambda_1>::operator()() [E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\RenderCore\Private\RenderingThread.cpp:1541]

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff66ffa3aba Rhea.exe!TGraphTask<TFunctionGraphTaskImpl<void __cdecl(void),1> >::ExecuteTask() [E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\Core\Public\Async\TaskGraphInterfaces.h:635]

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff66b679f83 Rhea.exe!UE::Tasks::Private::FTaskBase::TryExecuteTask() [E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\Core\Public\Tasks\TaskPrivate.h:505]

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff66b66ffe7 Rhea.exe!FNamedTaskThread::ProcessTasksNamedThread() [E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:779]

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff66b67042e Rhea.exe!FNamedTaskThread::ProcessTasksUntilQuit() [E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\Core\Private\Async\TaskGraph.cpp:668]

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff66ffca088 Rhea.exe!RenderingThreadMain() [E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\RenderCore\Private\RenderingThread.cpp:318]

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff66ffcd929 Rhea.exe!FRenderingThread::Run() [E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\RenderCore\Private\RenderingThread.cpp:443]

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff66bc55818 Rhea.exe!FRunnableThreadWin::Run() [E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\Core\Private\Windows\WindowsRunnableThread.cpp:159]

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff66bc4cd7f Rhea.exe!FRunnableThreadWin::GuardedRun() [E:\rhea_workspace\ue_rhea_src\Engine\Source\Runtime\Core\Private\Windows\WindowsRunnableThread.cpp:79]

[2025.09.08-17.22.54:373][451]LogWindows: Error: [Callstack] 0x00007ff8b7e2e8d7 KERNEL32.DLL!UnknownFunction

[2025.09.08-17.22.54:373][451]LogWindows: Error:

渲染线程和游戏线程的资源生命周期不同步,引擎尝试给一个 MaterialInstanceDynamic(MID_Post_Process_Wind_Fog_34)去做表达式缓存(Expression Cache),但这个 MID 已经被标记为被GC,马上就要销毁了,所以无法继续Cache。

但我们仔细检查应该不存在材质实例没有Hold住被GC的情况,请问还有什么可能会造成这种资源生命周期的不同步呢?​

重现步骤

MID是作为蓝图的成员变量存在的,所以肯定是可以Hold住该MID指针

已解决,是我们自行实现了一个SceneCapture组件,没有对SceneViewState进行引用,导致MIDPool被回收

好的,正好想问是不是有修改

因为MIDPool里的资产需要是需要调用SceneViewState 的AddReferenced加入引用的