Crash堆栈如下:
[2025.09.01-13.09.01:400][290]LogWindows: Error: === Critical error: ===
[2025.09.01-13.09.01:400][290]LogWindows: Error:
[2025.09.01-13.09.01:400][290]LogWindows: Error: Assertion failed: !AllocationFlags[Index] [File:D:\Gitlab\unrealengine\Engine\Source\Runtime\Core\Public\Containers\SparseArray.h] [Line: 111]
[2025.09.01-13.09.01:400][290]LogWindows: Error:
[2025.09.01-13.09.01:400][290]LogWindows: Error:
[2025.09.01-13.09.01:400][290]LogWindows: Error:
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff619c429ad Product.exe!TSparseArray<TSetElement<FGPUSkinCacheEntry * __ptr64>,TSparseArrayAllocator<TSizedDefaultAllocator<32>,FDefaultBitArrayAllocator> >::AllocateIndex()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff619c1da76 Product.exe!TSet<FGPUSkinCacheEntry * __ptr64,DefaultKeyFuncs<FGPUSkinCacheEntry * __ptr64,0>,FDefaultSetAllocator>::Emplace<FGPUSkinCacheEntry * __ptr64 const & __ptr64>()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff619ca353b Product.exe!FGPUSkinCache::ProcessEntry()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff61a745d7a Product.exe!FSkeletalMeshObjectGPUSkin::ProcessUpdatedDynamicData()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff61a759329 Product.exe!FSkeletalMeshObjectGPUSkin::UpdateDynamicData_RenderThread()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff61a6fee9c Product.exe!FSoundAttenuationSettings::operator==()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff617c239ce Product.exe!FRenderCommandPipe::ExecuteCommand()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff617c08e29 Product.exe!`FBatchedReleaseResources::Flush’::`5’::<lambda_1>::operator()()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff6131d45f3 Product.exe!UE::Tasks::Private::FTaskBase::TryExecuteTask()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff6131a75ff Product.exe!LowLevelTasks::TTaskDelegate<LowLevelTasks::FTask * __ptr64 __cdecl(bool),48>::TTaskDelegateImpl<`LowLevelTasks::FTask::Init<`UE::Tasks::Private::FTaskBase::Init’::`2’::<lambda_1> >‘::`13’::<lambda_1>,0>::CallAndMove()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff6131b270e Product.exe!LowLevelTasks::FTask::ExecuteTask()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff6131b248b Product.exe!LowLevelTasks::FScheduler::ExecuteTask()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff6131d7bcd Product.exe!LowLevelTasks::FScheduler::WorkerLoop()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff6131a0181 Product.exe!`FScopeCycleCounter::~FScopeCycleCounter’::`2’::<lambda_1>::operator()()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff6133a0d33 Product.exe!FThreadImpl::Run()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff6137c4f68 Product.exe!FRunnableThreadWin::Run()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ff6137bc5cf Product.exe!FRunnableThreadWin::GuardedRun()
[2025.09.01-13.09.01:400][290]LogWindows: Error: [Callstack] 0x00007ffd29177374 KERNEL32.DLL!UnknownFunction
[2025.09.01-13.09.01:400][290]LogWindows: Error:
[2025.09.01-13.09.01:400][290]LogWindows: Error: Crash in runnable thread Foreground Worker #
Crash 在 PendingProcessRTGeometryEntries.Add(InOutEntry) 这一句
bool FGPUSkinCache::ProcessEntry()
{
……
#if RHI_RAYTRACING
if (!Skin->ShouldUseSeparateSkinCacheEntryForRayTracing() || Mode == EGPUSkinCacheEntryMode::RayTracing)
{
// This is a RT skin cache entry
PendingProcessRTGeometryEntries.Add(InOutEntry);
}
#endif
return true;
}
<br/>
经调试发现该函数会被多个工作线程执行,
结合crash 堆栈,应该是多线程同时执行 PendingProcessRTGeometryEntries.Add(InOutEntry) 导致的,
目前加了个锁临时保护了下,如下
if (!Skin->ShouldUseSeparateSkinCacheEntryForRayTracing() || Mode == EGPUSkinCacheEntryMode::RayTracing)
{
FScopeLock Lock(&GPUSkinCacheEntrySetLock);
// This is a RT skin cache entry
PendingProcessRTGeometryEntries.Add(InOutEntry);
}
因为此行代码每帧都执行,不知是否合适,
期待官方的正式解决方案