영상을 불러오지 못했습니다

UE4→UE5 전환 후 AsyncLoading 재귀 assertion 진단

734 단어
4 분
UE4→UE5 전환 후 AsyncLoading 재귀 assertion 진단

UE4 프로젝트를 UE5로 전환한 뒤 editor에서는 동작하지만 패키징 빌드 로드 중 다음 assertion으로 종료되는 문제가 있었다.

AsyncLoadingThread.RecursionNotAllowed.Increment() == 1

문제 현상#

특정 map 또는 asset 묶음을 비동기로 불러올 때 AsyncLoading thread가 처리 중이던 로드 구간에 다시 진입해 assertion이 발생했다. UE4에서 선택적으로 쓰던 Event Driven Loader 설정과 UE5의 기본 로드 경로 차이 때문에 전환 직후 드러나기도 한다.

적용 범위#

UE4에서 UE5로 asset과 custom C++ serialization 코드를 함께 이관한 뒤 cooked build에서만 재현되는 경우를 다룬다. 원문에는 최종 offending asset이 남아 있지 않으므로 확정 해법이 아닌 진단 초안으로 유지한다.

가능한 원인#

  • Serialize, PostLoad 또는 UObject constructor에서 동기 asset load를 호출한다.
  • async load completion callback이 같은 package를 다시 동기로 요청한다.
  • custom archive/loader가 thread-safe하지 않은 전역 상태를 사용한다.
  • 오래된 cooked output이나 redirect가 다른 package graph를 만든다.
  • custom engine 수정이 UE5 AsyncLoading2 경로와 맞지 않는다.

재현 및 진단#

  1. assertion 전 전체 call stack과 마지막으로 로드한 package 이름을 수집해 둔다.
  2. LoadObject, StaticLoadObject, TryLoad, synchronous streamable handle 호출을 검색한다.
  3. 이 호출이 constructor, Serialize, PostLoad와 async callback 안에서 실행되는지 나눠 본다.
  4. 문제가 되는 map의 asset dependency를 줄여 최소 재현 package를 찾아낸다.
  5. stale cooked output을 배제한 clean cook에서 다시 확인해 본다.
  6. custom engine이라면 exact upstream revision과 AsyncLoading 관련 diff도 비교한다.

해결 방법#

로드 도중 다시 진입하는 동기 load를 제거하고 dependency를 soft reference와 상위 단계의 명시적 async request로 옮긴다. callback에서는 이미 완료된 object를 사용하고 같은 package graph를 다시 로드하지 않는다.

잘못된 asset reference나 redirect가 원인이라면 해당 asset을 새 버전에서 다시 저장하고 redirect를 정리한 뒤 전체 recook한다. assertion 자체를 끄거나 EDL 동작을 억지로 과거 방식으로 되돌리면 상태 손상을 숨길 우려가 있어 해결책으로 보지 않는다.

검증 방법#

  • editor, standalone과 packaged build에서 동일한 map 순서를 반복해 본다.
  • cold start와 이미 asset cache가 채워진 두 상황을 시험한다.
  • 여러 번의 level transition과 비동기 취소 경로를 확인해 둔다.
  • package 이름을 포함한 로드 로그에서 같은 package의 재진입이 사라졌는지 살펴본다.

주의점#

call stack만으로 “UE5에서는 EDL이 항상 켜져서 생긴다”고 단정할 수 없다. UE5의 async loading 구현도 minor version마다 바뀌므로 exact engine source를 확인하며 조사해야 한다.

참고 자료#

글 공유하기

이 글이 도움이 되셨다면 다른 사람과 공유해 주세요!

UE4→UE5 전환 후 AsyncLoading 재귀 assertion 진단
https://hon454.github.io/posts/ue5-async-loading-recursion-edl-migration/
작성자
Jihoon Jeon
게시일
2023-11-03
라이선스
CC BY-NC-SA 4.0
관련 게시글스마트
1
RecastNavMesh export/load flags 크래시 진단
Unreal Engine특정 저장 데이터를 불러올 때 RecastNavMesh의 export와 load flags가 일치하지 않아 발생한 크래시를 지도 내 내비게이션 데이터 관점에서 진단합니다.
2
전체화면 PIE 종료 시 ForEachAttachedActors 재귀 크래시
Unreal Engine전체화면 PIE를 종료할 때 AActor::ForEachAttachedActors가 재귀하며 스택 오버플로를 일으킨 사례를 컴포넌트 소유권과 부착 계층 관점에서 정리합니다.
3
이직 준비: 2026.08 Unreal·Unity 클라이언트와 개발 PM 채용 분석
커리어2026년 8월 22일 게임잡의 Unreal·Unity 클라이언트 및 엔진 개발, 개발 PM 공고를 다시 조사하고 반복 요구사항을 공개 이력서와 비교해 지원 트랙과 준비 우선순위를 정리합니다.
4
Jekyll에서 Astro 기반 블로그로, 그리고 Firefly를 선택한 이유
블로그Jekyll로 운영하던 GitHub Pages 블로그를 Astro 기반으로 옮긴 이유와, 콘텐츠 중심 구조·Svelte 인터랙션·개인화 기능을 갖춘 Firefly를 최종 테마로 선택한 기준을 정리합니다.
5
Unreal Engine “Asset has been saved with empty engine version” 경고 안전하게 해결하기
Unreal EngineAsset package의 SavedByEngineVersion changelist가 0일 때 발생하는 경고의 정확한 의미와, nonzero-CL 엔진에서 ResavePackages로 metadata를 복구하고 결과를 검증하는 안전 절차를 설명합니다.
무작위 게시글무작위

댓글

Profile Image of the Author
Jihoon Jeon
안녕하세요! 서브컬처와 자전거를 사랑하는 개발자 전지훈입니다.
공지사항
제 블로그에 오신 것을 환영합니다! 예시 공지입니다.
카테고리
태그
최신 일상
사이트 통계
게시글
46
카테고리
10
태그
139
총 단어 수
103,271
운영 일수
0
최근 활동
0일 전
사이트 정보
빌드 플랫폼
GitHub Actions
블로그 버전
Firefly v6.16.3
라이선스
CC BY-NC-SA 4.0