• 티스토리 홈
  • 프로필사진
    SiJun-Park
  • 방명록
  • 공지사항
  • 태그
  • 블로그 관리
  • 글 작성
SiJun-Park
  • 프로필사진
    SiJun-Park
    • 분류 전체보기 (190)
      • Unity (148)
        • 출시 해보기 (Slime Company) (3)
        • 뱀서류 Project (34)
        • Defense Project (20)
        • FPS Project (30)
        • RPG Project (39)
        • 기타 - 개발 (22)
      • 개발 (35)
        • 임베디드 소프트웨어 (7)
        • 컴파일러 (6)
        • 기계학습 (8)
        • 보안 (8)
        • 그래픽스 (2)
        • 그 외 (4)
      • 코딩문제 (6)
  • 방문자 수
    • 전체:
    • 오늘:
    • 어제:
  • 최근 댓글
      등록된 댓글이 없습니다.
    • 최근 공지
        등록된 공지가 없습니다.
      # Home
      # 공지사항
      #
      # 태그
      # 검색결과
      # 방명록
      • 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
        다음글
        다음 글이 없습니다.
        이전글
        이전 글이 없습니다.
        댓글
      조회된 결과가 없습니다.
      스킨 업데이트 안내
      현재 이용하고 계신 스킨의 버전보다 더 높은 최신 버전이 감지 되었습니다. 최신버전 스킨 파일을 다운로드 받을 수 있는 페이지로 이동하시겠습니까?
      ("아니오" 를 선택할 시 30일 동안 최신 버전이 감지되어도 모달 창이 표시되지 않습니다.)
      목차
      표시할 목차가 없습니다.
        • 안녕하세요
        • 감사해요
        • 잘있어요

        티스토리툴바