FAsyncPurge crash 관련 문의 드립니다.

안녕하세요.

FAsyncPurge에서 아주 낮은 확률로 재현 방법을 모르는 crash가 발생하여 문의 드립니다.

  1. 관련 Crash의 주요 원인이 궁금합니다.
  2. ​FAsyncPurge가 sha: 01e68597e74ecd38a4830e4348047cc29098b940 에서 GT에서만 동작하도록 변경 되었는데 변경 이유(히스토리)가 궁금합니다.

​​

shipping Win64 이며, cpp 라인의 경우 5.3.2 순정엔진과 비교해서 정확한 라인은 아닐 수 있습니다.

--- Thread Name: FAsyncPurge (Crashed) ---

FAsyncPurge::Run [GarbageCollection.cpp:748]

FRunnableThreadWin::Run [WindowsRunnableThread.cpp:149]

FRunnableThreadWin::GuardedRun [WindowsRunnableThread.cpp:79]

--- Thread Name: GameThread ---

FMallocBinned2::Free [MallocBinned2.h:736]

FAsyncPurge::TickPurge [GarbageCollection.cpp:696]

IncrementalDestroyGarbage [GarbageCollection.cpp:4332]

IncrementalPurgeGarbage [GarbageCollection.cpp:4019]

UE::GC::CollectGarbageImpl<1> [GarbageCollection.cpp:4877]

CollectGarbage [GarbageCollection.cpp:5018]

UEngine::TrimMemory [UnrealEngine.cpp:16078]

UEngine::LoadMap [UnrealEngine.cpp:15659]

UEngine::Browse [UnrealEngine.cpp:15127]

UEngine::TickWorldTravel [UnrealEngine.cpp:15325]

UGameEngine::Tick [GameEngine.cpp:1850]

FEngineLoop::Tick [LaunchEngineLoop.cpp:5894]

GuardedMain [Launch.cpp:188]

GuardedMainWrapper [LaunchWindows.cpp:118]

LaunchWindowsStartup [LaunchWindows.cpp:258]

WinMain [LaunchWindows.cpp:299]

감사합니다.​

안녕하세요.

FAsyncPurge는 4.25에서 GC 시 게임 스레드 대기 없이 오브젝트를 파괴하기 위해 도입되었으며 5.5에서 변경사항에 따라 성능 이득이 없어져 복잡성 제거 및 스레드 안정성을 위해 FObjectPurge로 변경되어 게임 스레드에서 동작하게 되었습니다.

https://github.com/EpicGames/UnrealEngine/commit/2292691d8cdb8997dd1558252843fcc79e8bb6cc

// From now on we'll be destroying objects without time limit during exit purge
// so doing it on a separate thread doesn't make anything faster,
// also the exit purge is not a standard GC pass so no need to overcompilcate things 

또한 FObjectPurge 변경 전후로 단일 스레드 환경 성능 개선이 진행되었습니다.

Unreachable 관련 개선 https://github.com/EpicGames/UnrealEngine/commit/3f219e2bdda1315c5d4c1fe761b0e4dcfe9e056d

오브젝트 파괴 관련 개선 https://github.com/EpicGames/UnrealEngine/commit/09bcab1be67dc1330a22ebf777d5a3565e096c4c

현재 발생한 이슈는 레벨 이동 간 메모리 해제 시 발생한 것으로 보이며, 오브젝트 파괴 시 경쟁 상태 또는 중복 파괴가 원인인 것으로 파악됩니다.

상위 버전 변경사항 적용 또는 GMultithreadedDestructionEnabled 를 비활성화하거나 아래 케이스가 유사한 경우로 보여 살펴보시면 문제 해결에 도움이 될 것으로 생각합니다.

[Content removed]

감사합니다.