[2025_11_24]유니티 Batching을 이용한 최적화 및 Addressble

2025. 11. 25. 20:42TIL

Unity 최적화 및 Addressables

배운 점

렌더링 최적화 핵심 개념

Draw Call CPU가 GPU에게 "이거 그려줘"라고 요청하는 렌더링 명령 단위입니다. Draw Call이 많아지면 CPU-GPU 간 통신 오버헤드가 증가하여 성능이 저하됩니다.

Batching 여러 오브젝트나 Material을 공유할 때 Draw Call을 하나로 묶어서 GPU에 요청하는 최적화 기술입니다.

  • Static Batching: 움직이지 않는 오브젝트(배경, 바닥, 벽)에 사용하며, Inspector 우측 상단 Static 체크박스로 설정
  • Dynamic Batching: 움직이는 오브젝트용이지만 조건이 까다로워 현재는 거의 사용하지 않음

중요한 인사이트

  • 무조건 Draw Call이 적다고 빠른 것은 아님
  • 1개의 무거운 Draw Call > 10개의 가벼운 Draw Call일 수 있음
  • 목표는 "불필요한" Draw Call을 줄이는 것

Sprite Atlas 여러 이미지를 하나의 Atlas로 묶어 Draw Call을 줄이는 기법입니다. 2D 애니메이션도 Atlas로 묶으면 Batching 적용이 가능

Canvas 최적화 원리

Canvas Rebuild 메커니즘 Canvas 내부에서 어떤 UI나 오브젝트의 속성(위치, 크기, 회전 등)이 변하면 Canvas 전체를 처음부터 다시 그림

Batching이 깨지는 경우 Canvas 내에서 같은 Material로 묶인 오브젝트의 Z값이 달라지면 Batching이 깨짐

Addressables 시스템

사용 이유

  1. 메모리 최적화: 전체 리소스를 한 번에 메모리에 올릴 필요 없이 필요한 순간에만 로드/언로드
  2. 빌드 크기 관리: 필요한 리소스만 빌드, 플랫폼별 번들 분리 가능
  3. 라이브 업데이트: 앱 재배포 없이 서버에서 리소스 업데이트 가능

Addressable Hosting 네트워크에 Addressable 에셋을 올려 다운받게 하는 임시 서버 기능입니다.

Catalog Addressable에 추가된 데이터들의 목차를 관리하며, 버전이 바뀐 것만 다운받을 수 있게 해줍니다.

메모리 관리 핵심 Addressable로 로드한 리소스로 생성된 인스턴스는 이미 메모리에 객체로 올라가 있기 때문에 Addressable을 Release해도 해당 인스턴스는 해제 안됨


적용 법

Static Batching 적용

설정 방법

  1. 움직이지 않는 오브젝트 선택
  2. Inspector 우측 상단 Static 체크박스 활성화

전략적 배칭

  • 비슷한 오브젝트끼리 묶기 (풀은 풀끼리, 나무는 나무끼리)
  • 너무 큰 오브젝트를 Static으로 설정하면 메모리 사용량 증가 주의

Sprite Atlas 적용

생성 방법

  1. 여러 이미지를 하나의 Atlas로 묶기
  2. 2D 애니메이션도 Atlas에 포함 가능

주의사항

  • 무기나 아이템처럼 여러 곳에서 사용되는 리소스는 Atlas로 묶으면 관리가 어려움
  • Frame Debugger로 확인하며 신중하게 결정

Canvas 최적화 적용

Canvas 분리 전략

  • 움직이는 요소는 별도의 Dynamic Canvas로 분리
  • 인벤토리처럼 변동이 잦은 UI는 Dynamic Canvas로 이동
  • 자주 SetActive()되는 요소(ToolTip 등)는 어디에 두어도 무방

Batching 유지 방법

  • Canvas 내 오브젝트들의 Z값을 동일하게 유지

버튼 처리

  • Frame Debugger를 보면서 분리 여부 결정
  • 최적화 vs 작업 효율 간 균형 고려

최적화 검증 방법

Frame Debugger 활용

  1. 최적화 전 Draw Call 스크린샷 촬영
  2. 최적화 작업 수행
  3. 최적화 후 Draw Call 스크린샷 촬영
  4. 어떤 방식으로 Draw Call을 줄였는지 포트폴리오에 정리

Addressables 설정 및 적용

초기 설정

  1. 그룹 Inspector에서 Build & Load Paths를 Remote로 변경 (Hosting 사용 시)
  2. Build Remote Catalog 체크
  3. Build & Load Path를 Catalog로 설정

테스트 프로세스

  • 중간중간 Play Mode Scripts로 OSX 빌드 환경 테스트
  • 단위 기능별로 dependency 깨짐 여부 확인

Insecure 에러 해결

  1. Project Settings → Player 진입
  2. Allow downloads over HTTP를 Always allowed로 변경

빌드 관리

  • Update a Previous Build는 신뢰하지 말 것
  • Clear Build Cache로 지우고 새로 빌드하는 것이 안전

Addressables 메모리 관리

Release 타이밍

  • 보통 씬이 바뀔 때 Release 수행
  • 생성된 인스턴스는 Release해도 메모리에 남아있음을 인지

실전 예시

// 적 오브젝트를 Addressable로 생성
// Release를 호출해도 이미 생성된 적들은 메모리에 유지됨
// 씬 전환 시 Release 호출