안녕하세요, 규니티입니다.
최적화 특집 시리즈 마지막 편입니다. 오늘 주제는 모바일 특화 최적화예요.
1~3편에서 Profiler 보는 법, Draw Call 줄이기, 코드 레벨 실수들을 다뤘는데, 이번 편은 조금 결이 달라요. PC에서 멀쩡하게 돌아가던 게임이 모바일 빌드하면 갑자기 버벅이거나 발열이 심해지는 경우가 꽤 있거든요. 모바일은 PC랑 환경 자체가 다르기 때문에 따로 챙겨야 할 것들이 있어요. 오늘은 그중에서 가장 자주 놓치는 세 가지를 정리해봤습니다.
1. Target Frame Rate 설정
모바일에서 가장 먼저 챙겨야 할 게 이거예요.
Unity는 기본적으로 프레임을 제한 없이 뽑으려고 해요. PC에서는 괜찮지만 모바일에서는 그냥 두면 배터리가 빠르게 닳고 기기가 뜨거워지면서 OS가 강제로 클럭을 낮춰버려요. 이게 서멀 스로틀링이에요. 게임 플레이 중에 갑자기 프레임이 뚝 떨어지는 원인 중 하나가 바로 이거예요.
해결법은 간단해요.
// Awake() 또는 Start()에서 한 번만 설정
void Awake()
{
Application.targetFrameRate = 30; // 또는 60
QualitySettings.vSyncCount = 0; // 모바일에서는 vSync 끄기
}
vSyncCount를 0으로 꺼야 targetFrameRate가 제대로 적용돼요. vSync가 켜져 있으면 targetFrameRate 설정이 무시되거든요.
목표 프레임은 게임 장르에 따라 다른데, 모바일 게임은 보통 30fps를 목표로 잡아요. 60fps는 배터리 소모가 두 배가까이 늘어나서 장시간 플레이하는 게임이라면 30fps가 현실적인 선택이에요.
프레임 예산도 다시 짚고 넘어갈게요. 30fps 목표라고 해서 33ms를 꽉 채우면 안 돼요. 발열 때문에 여유를 35% 정도 남겨두는 게 좋아서, 실제 목표는 22ms 이하로 잡는 게 맞아요.
30fps 기준 프레임 예산: 33.33ms
모바일 실제 목표: 22ms 이하 (35% 여유)
2. 텍스처 압축
모바일에서 메모리 터지는 원인 1순위가 텍스처예요.
압축 없이 텍스처를 임포트하면 메모리에 올라갈 때 원본 크기 그대로 올라가요. 1024x1024 텍스처 하나가 압축 없이 RGBA32면 메모리에서 4MB를 잡아먹어요. 텍스처가 수십 개면 금방 터지죠.
모바일에서 권장하는 압축 포맷이에요.
Android → ETC2 (RGBA 지원, 대부분의 Android 기기 호환)
iOS → ASTC (품질 좋고 유연함, iOS 권장 포맷)
적용 방법은 텍스처 선택 → 인스펙터 → Override for Android / iOS 탭에서 포맷 변경하면 돼요.
텍스처 선택
→ Inspector → Android 탭 클릭
→ Format → ETC2 RGBA8 선택
→ Apply
추가로 챙길 것들
텍스처 크기는 2의 제곱수로 맞춰야 해요. 512, 1024, 2048처럼요. 2의 제곱수가 아니면 압축이 제대로 안 되거나 메모리 낭비가 생겨요.
멀리 있는 오브젝트에 쓰이는 텍스처는 Max Size를 낮춰도 티가 잘 안 나요. 인스펙터에서 Max Size를 512나 256으로 낮추는 것만으로도 메모리가 꽤 줄어요.
Mipmap도 챙겨두세요. 거리에 따라 낮은 해상도 텍스처를 자동으로 쓰는 기능인데, 3D 오브젝트에는 켜두는 게 성능이 더 좋아요. 단, UI 텍스처는 끄는 게 맞아요.
3. 그림자 설정
그림자는 모바일에서 생각보다 비용이 커요. 실시간 그림자는 매 프레임 씬 전체를 다시 렌더링해서 그림자 맵을 만들거든요.
Shadow Distance 줄이기
가장 간단하고 효과 큰 설정이에요.
Edit → Project Settings → Quality → Shadows → Shadow Distance
기본값이 150으로 되어있는 경우가 많은데, 모바일에서는 20~30 정도로 확 낮춰도 체감상 큰 차이가 없어요. 멀리 있는 오브젝트 그림자는 어차피 잘 안 보이거든요.
Shadow Resolution 낮추기
Project Settings → Quality → Shadow Resolution → Low 또는 Medium
그림자 해상도를 낮추면 품질이 약간 떨어지지만 성능은 꽤 올라요. 모바일 화면 크기에서는 High랑 Low 차이가 생각보다 안 느껴져요.
Shadowmask 또는 Baked Shadow 활용
움직이지 않는 오브젝트는 실시간 그림자 대신 라이트맵으로 구워버리는 게 제일 좋아요. 런타임에 그림자 연산이 아예 없어지거든요.
오브젝트 Static 체크 → Lighting 탭 → Bake 설정
캐릭터처럼 움직이는 오브젝트만 실시간 그림자 남기고, 배경은 전부 구워두면 모바일 성능이 눈에 띄게 좋아져요.
4. 추가로 간단하게 챙길 것들
해상도 스케일링
모바일 기기 해상도가 높아지면서 그냥 두면 렌더링 부하가 커요. 해상도를 살짝 낮춰도 체감 품질 차이가 별로 없는 경우가 많아요.
// 해상도를 80%로 낮추기
Screen.SetResolution(
(int)(Screen.width * 0.8f),
(int)(Screen.height * 0.8f),
true
);
Post Processing 주의
Bloom, Depth of Field 같은 포스트 프로세싱 효과는 모바일에서 비용이 커요. PC용으로 만들어진 에셋을 그냥 쓰면 모바일에서 프레임이 반 토막 나는 경우도 있어요. 꼭 필요한 효과만 남기고 나머지는 모바일 빌드에서 꺼두는 게 좋아요.
마무리
모바일 최적화 핵심을 정리하면 이래요.
Target Frame Rate → 30fps + vSync 끄기
텍스처 압축 → Android: ETC2 / iOS: ASTC
그림자 → Shadow Distance 줄이고 정적 오브젝트는 굽기
PC에서 멀쩡해도 모바일에서 터지는 이유가 대부분 이 세 가지 중 하나예요. 모바일 빌드 전에 체크리스트처럼 훑어보는 습관만 들여도 출시 후 뒤통수 맞는 일이 확 줄어들어요.
이렇게 최적화 특집 시리즈 4편을 마칩니다. 1편부터 따라오신 분들 수고하셨어요. 다음엔 더 유익한 주제로 찾아올게요!
'유니티' 카테고리의 다른 글
| 게임 최적화(3) - 초보들이 놓치기 쉬운 최적화! (0) | 2026.06.10 |
|---|---|
| 게임 최적화(2) - Draw Call 줄이기 (0) | 2026.05.28 |
| 게임 최적화(1) - Unity Profiler 읽는 법! (0) | 2026.05.21 |
| 최적화 - 유니티 최적화 시리즈 시작! (0) | 2026.05.08 |
| Unity 기능 리뷰 - Avatar Mask + Animator Layer (1) | 2026.04.16 |
