모바일에서 Unity로 앱이나 게임을 만들다 보면 “점점 느려지는 것 같다”는 느낌을 받기 쉽습니다.
특히 기능이 쌓이고, 화면에 오브젝트가 많아질수록 프레임이 떨어지고 발열이 심해지죠.
이 글에서는 Unity URP(Universal Render Pipeline) 환경에서 자주 쓰이는 최적화 개념들을 한 번에 정리해보겠습니다.
🎯 1. FPS vs 프레임 타임
- FPS(Frame Per Second): 1초에 그려지는 화면 수.
- 프레임 타임(Frame Time): 한 프레임 처리 시간(ms).
👉 60FPS 목표 = 16.67ms, 30FPS 목표 = 33.33ms 이내 유지해야 안정적입니다.
프레임 타임이 들쭉날쭉하면 FPS가 높아도 “버벅임”이 느껴집니다.
⚙️ 2. 병목(Bottleneck) 구분
- CPU 바운드: 스크립트, 물리, 드로우콜 관리가 병목.
- GPU 바운드: 해상도, 쉐이더, 픽셀 처리, 포스트 프로세싱이 병목.
Unity Profiler에서 Main Thread / Render Thread / GPU 시간을 비교해 어디서 문제가 생기는지 확인해야 합니다.
🖼️ 3. 드로우콜(Draw Call) & 배칭(Batching)
- 드로우콜: GPU에 “그려라”는 명령. 많을수록 성능 저하.
- SetPass Call: 드로우콜 중 머티리얼/셰이더 변경이 일어나는 지점 → 더 무거움.
- Batching: 여러 오브젝트를 묶어 한 번에 렌더링.
- Static Batching: 고정된 오브젝트 병합
- Dynamic Batching: 작은 메시 자동 병합
- GPU Instancing: 같은 메시를 한 번에 여러 개 처리
🚀 4. SRP Batcher
URP에서 제공하는 최적화 기능.
동일 셰이더를 사용하는 객체들을 묶어서 CPU → GPU 전달 비용을 크게 줄여줍니다.
👉 URP Asset 설정에서 SRP Batcher 활성화는 필수!
🔲 5. 오버드로우(Overdraw)
같은 픽셀이 여러 번 그려지는 현상.
UI, 반투명 파티클, 풀스크린 이펙트에서 흔히 발생.
👉 UI Canvas 분리, 반투명 최소화, 파티클 최적화가 해법입니다.
🗑️ 6. GC(Garbage Collector)와 GC Alloc
- GC: 메모리를 자동으로 정리하는 과정. 실행 시 순간 끊김 발생 가능.
- GC Alloc: 프레임마다 새 메모리 할당. 많을수록 성능 저하.👉 해결: 오브젝트 풀링, StringBuilder, List.Clear() 재사용.
- 👉 목표: 런타임에서 GC Alloc 0B/frame.
♻️ 7. 오브젝트 풀링(Object Pooling)
Instantiate/Destroy 반복은 GC 폭탄 💣
👉 풀에 미리 만들어두고 꺼내쓰고 돌려놓는 방식.
투사체, 이펙트, UI 팝업에 특히 필수입니다.
👁️ 8. LOD & 오클루전 컬링
- LOD(Level of Detail): 멀리 있는 객체는 간단한 모델로 교체.
- Occlusion Culling: 카메라에 보이지 않는 객체는 아예 렌더링 안 함.
- 👉 많은 오브젝트가 있는 씬에서 GPU 최적화 핵심.
📐 9. Render Scale
URP의 렌더링 해상도 비율 조절 옵션.
1.0 = 원본 해상도, 0.8 = 80%로 그린 후 업스케일.
👉 고해상도 기기에서 성능 확보에 매우 효과적.
🔍 10. Profiler 체크리스트
- CPU Usage: 스크립트/렌더/물리/애니메이션 시간
- GPU Usage: 픽셀 처리, 쉐이더, 포스트 효과
- Rendering 모듈: Batches, SetPass Calls, Triangles
- Memory 모듈: GC Alloc, GC Heap, 사용 메모리 추세
- Frame Time: 평균, 최대, 95% 구간
👉 **“측정 없이 최적화하지 말라”**는 게 핵심 원칙입니다.
✨ 마무리
Unity 최적화는 한 번에 다 하는 게 아니라,
- 목표 FPS/프레임 타임 설정 →
- Profiler로 병목 확인 →
- 필요한 부분부터 점진적으로 개선
이 흐름이 정석입니다.
작은 습관(빈 Update 없애기, 풀링 사용하기, 드로우콜 줄이기)만 지켜도 앱은 훨씬 가볍고 안정적으로 돌아갑니다.
'Unity' 카테고리의 다른 글
| 📱 구글 플레이 16KB 페이지 사이즈 정책과 유니티(Unity) 대응 가이드 (0) | 2025.09.20 |
|---|---|
| InvalidOperationException: Insecure connection not allowed (0) | 2025.04.21 |
| Unity Android dependencyResolutionManagement (0) | 2025.04.14 |
| 🎮 FPS? Draw Call?모바일 게임 퍼포먼스 기준을 공부하며 정리해봤습니다 (0) | 2025.03.31 |
| Unity Resolver이용해 라이브러리 iOS Target 설정하는 방법 (1) | 2024.07.14 |