AssetManager가 Preload한 에셋의 생명주기 관리에 대해 정리했다.AssetManager가 로드한 에셋을 계속 강참조로 잡고 있으면,
레벨이 바뀐 뒤에도 이전 레벨에서만 쓰던 에셋이 메모리에 남을 수 있다.
이번에 추가한 구조
AssetManager에 현재 Preload가 소유하고 있는 에셋 경로 목록을 추가했다.
TSet ActivePreloadAssetPathStrings;
LoadedAssets 안에 Preload 외의 에셋도 들어가기 때문에LoadedAssets가 실제 UObject 강참조 풀이라면, ActivePreloadAssetPathStrings는 그중에서 Preload가 관리하는 대상을 구분했다.
GameData
UI Widget Class
공통 Material
수동 GetAsset으로 유지한 에셋
Preload 목록 비교
1. 다음 Preload에서 사용할 에셋 경로 목록을 만든다.
2. 이전 Preload 경로 목록과 비교한다.
3. 다음 목록에 없는 이전 에셋은 LoadedAssets에서 제거한다.
4. 다음 목록에 있는 에셋은 그대로 유지한다.
5. ActivePreloadAssetPathStrings를 다음 목록으로 교체한다.
for (const FString& ActivePreloadAssetPathString : ActivePreloadAssetPathStrings)
{
if (NextPreloadAssetPathStrings.Contains(ActivePreloadAssetPathString))
{
continue;
}
const FSoftObjectPath ActivePreloadAssetPath(ActivePreloadAssetPathString);
if (const UObject* ActivePreloadAsset = ActivePreloadAssetPath.ResolveObject())
{
ReleasedCount += LoadedAssets.Remove(ActivePreloadAsset);
}
}
ActivePreloadAssetPathStrings = MoveTemp(NextPreloadAssetPathStrings);
LoadedAssets에서 강참조를 제거한다.
LevelPreloadDataAsset 자체도 유지 대상에 포함
이번 구조에서는 Preload 대상 에셋뿐 아니라 LevelPreloadDataAsset 자체도 유지 대상에 넣었다.
AddUniqueAssetPath(
RetainedPreloadAssetPaths,
RetainedAssetPathStrings,
LevelPreloadDataAsset.ToSoftObjectPath());
Inventory Preload를 사용하는 경우에는 InventoryPreloadDataAsset도 유지 대상에 포함한다.
if (LoadedLevelPreloadData->bUseInventoryPreloadDataAsset)
{
AddUniqueAssetPath(
RetainedPreloadAssetPaths,
RetainedAssetPathStrings,
LoadedLevelPreloadData->InventoryPreloadDataAsset.ToSoftObjectPath());
}
이렇게 한 이유는 DataAsset도 로딩 흐름의 일부이기 때문이다.
다음 레벨에서도 같은 Inventory Preload DataAsset을 사용한다면 굳이 놓았다가 다시 잡을 필요가 없다.
이번 구조의 기준
이번 작업으로 Preload 생명주기의 기준은 이렇게 정리됐다.
GameData / 공통 UI 클래스
→ AssetManager의 일반 로드 캐시로 유지
현재 LevelPreload에서 로드한 에셋
→ ActivePreloadAssetPathStrings로 추적
다음 LevelPreload에서도 사용하는 에셋
→ 유지
다음 LevelPreload에서 사용하지 않는 에셋
→ LoadedAssets에서 제거
확인할 점
다음과 같은 방법으로 메모리 변화를 확인해야 한다
Unreal Memory Report
Obj List / Obj Refs
레벨 이동 후 GC 타이밍반응형
'TIL' 카테고리의 다른 글
| In Place 작업 (0) | 2026.07.22 |
|---|---|
| ABP → AnimInstance 전환 (0) | 2026.07.20 |
| LevelDataAssetGenerator 수정 (0) | 2026.07.15 |
| IK (0) | 2026.07.14 |
| WorldContextObject (0) | 2026.07.10 |