- Addressable & 메모리 로딩 공부2026년 01월 08일
- SiJun-Park
- 작성자
- 2026.01.08.:50
최적화를 공부하다 Addressable이라는 것을 접하게 되었다..

이것이 과연 최적화에 정말 좋을까? 싶은 마음에 공부를 하였습니다.
Addressable이란?
필요할 때만 메모리에 올리고, 쓸 때만 유지하고, 끝나면 반드시 내리는 설계입니다.
이게 왜 최적화냐면
처음에 모든 몬스터 프리팹, 스킬 이펙트, 사운드 UI가 게임 시작 시 전부 메모리에 올라가 있습니다.
그 결과로 초기 로딩이 느려지고, 모바일 같은 경우는 메모리 초과가 날 수 있으며, 씬이 바뀌어도 메모리 안내려가는 문제가 생깁니다.
var obj = Instantiate(prefab);기존의 문제를 보면 Prefab은 이미 메모리에 올라가있고, 언제 내려가는지 제어가 불가능합니다.
즉 씬을 전환해도 남아있습니다.
*무조건 제어가 불가능한 것은 아닙니다.
이걸 해결하기 위해 사용을 합니다.
var handle = Addressables.LoadAssetAsync<GameObject>("Monster_Golem"); await handle.Task; var monster = Instantiate(handle.Result);위 처럼 기본적으로 사용하게 되고
Addressables.Release(handle);반드시 이렇게 Release를 해야합니다.
* Release 안 하면 reference count가 남아 언로드되지 않아 메모리가 유지될 수 있다.
그러면 풀링이랑 뭐가 다른가?
풀링 같은 경우는 인스턴스 재사용을 하고 CPU/GC를 절약하지만 메모리는 계속 점유하게 됩니다.
다만 Addressables은 에셋 자체를 메모리에서 제거하고, 메모리 절약을 하지만 Instantiate 비용은 존재합니다.
그러면 둘 다 장단점이 있는데 어떻게 쓰냐?
간단하게 해결을 할 수 있습니다.
1. Addressables 로드
2. 로드된 프리팹으로 풀 생성
3. 게임 플레이
4. 씬 종료 또는 지역 이동
5. 풀 전부 반환
6. Addressables Release
이 순서대로 한다면 생성 비용도 들지 않고 GC도 없으며 메모리 낭비도 되지 않습니다.
그래서 이전에 오브젝트 풀링으로 풀 100개 만들어 뒀을 때 10개만 사용하면 낭비 아니냐? 이 문제의 답을 낼 수 있습니다.
즉 Addressables 구조를 사용해 안 쓰는 지역 몬스터 풀 자체를 제거하고, 필요할 때 다시 로드하는 방식으로 사용할 수 있습니다.
Addressables의 Load와 Release의 본질
제가 공부하면서 생각을 했던 매우 중요한 내용입니다.
Addressables는 에셋을 직접 들고 있는게 아니라, 핸들을 빌려쓰는 구조입니다.
var handle = Addressables.LoadAssetAsync<GameObject>("Monster_Golem");여기서 일어나는 일을 순차적으로 적으면
1. Monster_Golem 주소를 키로 검색
2. 에셋이 메모리에 없으면 로드
3. 에셋이 이미 있으면 참조 카운트 + 1
4. 결과를 AsyncOperationHandle로 반환
*즉 여기서 handle은 에셋에 대한 "대여증"이라고 해석을 하면 됩니다.
또한, 실제 에셋은 Addressables 시스템이 관리합니다.
var monster = Instantiate(handle.Result);그리고 제가 공부하면서 헷갈렸던 것이 Instatiate 했는데 왜 Release를 해야하나 입니다.
즉 이미 인스턴스를 만들었는데 Release하면 사라지는거 아닌가? 싶었습니다.
결론적으론 아닙니다.
Instatniate는 복사본이고, Release(handle)은 원본 에셋 참조 반환이기 때문에
Release해도 인스턴스는 사라지지 않습니다.
그래서 실제 하는 일을 보면
1. 참조 카운트 - 1
2. 참조 수가 0이면 메모리에서 에셋 언로드, 번들 해제 가능 상태가 됩니다.
즉, Release는 파괴가 아니라 반납입니다.
var handle = Addressables.LoadAssetAsync<GameObject>("A"); Addressables.Release(handle);로드 완료 전/사용 중에 Release하면 예상치 못한 동작(참조 무효/에셋 언로드/누락 등)이 발생할 수 있다!
핵심 개념은 3가지!
1. 지연 로딩 (Lasy Load)
2. Reference Count (참조 수 관리)
3. Release (명시적 해제)
'Unity > 기타 - 개발' 카테고리의 다른 글
Update에 대한 오해 기록용 (0) 2026.01.21 Culling 공부 (0) 2026.01.11 Object Pooling 회고 (0) 2026.01.06 람다식 / LINQ 회고 (0) 2026.01.06 foreach / Animator 최적화 공부 기록 (0) 2026.01.01 다음글이전글이전 글이 없습니다.댓글