Unity 모바일 최적화 전략
렌더링 최적화
섹션 제목: “렌더링 최적화”해상도와 렌더 스케일
섹션 제목: “해상도와 렌더 스케일”// 동적 해상도 (URP)// URP Asset → Rendering → Render Scale: 0.75 (기본 1.0)
// 런타임 동적 조절UniversalRenderPipeline.asset.renderScale = 0.75f;
// 기기 성능에 따른 자동 조절void AdjustResolution() { float fps = 1f / Time.smoothDeltaTime; float scale = fps < 25f ? 0.6f : fps < 45f ? 0.75f : 1.0f; UniversalRenderPipeline.asset.renderScale = scale;}포스트 프로세싱 제한
섹션 제목: “포스트 프로세싱 제한”// 모바일에서 비용 높은 효과 비활성화void ApplyMobileSettings() { var volume = FindObjectOfType<Volume>(); if (volume?.profile.TryGet<DepthOfField>(out var dof) == true) dof.active = false; if (volume?.profile.TryGet<MotionBlur>(out var mb) == true) mb.active = false;}텍스처 압축
섹션 제목: “텍스처 압축”| 플랫폼 | 권장 포맷 |
|---|---|
| Android (Vulkan) | ASTC |
| Android (OpenGL) | ETC2 |
| iOS | ASTC |
Project Settings → Player → Android Texture Compression: ASTC (권장)
텍스처 Import Settings: Max Size: 1024 (UI), 512 (소품) Generate Mip Maps: 3D 오브젝트만 활성화메모리 관리
섹션 제목: “메모리 관리”// 1. 씬 전환 시 명시적 GCasync Task LoadScene(string name) { await SceneManager.LoadSceneAsync(name); Resources.UnloadUnusedAssets(); GC.Collect(); await Task.Yield();}
// 2. 텍스처 런타임 해제Destroy(texture);texture = null;
// 3. 오디오 클립 압축 설정// AudioClip Inspector:// Load Type: Compressed In Memory (짧은 효과음)// Load Type: Streaming (배경음악)// Compression Format: Vorbis Quality 70물리 최적화
섹션 제목: “물리 최적화”// 1. Fixed Timestep 조정 (기본 0.02 = 50Hz)Time.fixedDeltaTime = 1f / 30f; // 모바일: 30Hz로 낮춤
// 2. 레이캐스트 최적화// LayerMask로 불필요한 레이어 제외int mask = LayerMask.GetMask("Ground", "Enemy");Physics.Raycast(ray, out hit, 100f, mask);
// 3. 비활성 오브젝트 Rigidbody 슬립rb.Sleep(); // 정지 오브젝트 물리 계산 제외
// 4. 충돌 레이어 매트릭스 정리// Physics Settings → Layer Collision Matrix에서 불필요 조합 해제배터리 및 열 관리
섹션 제목: “배터리 및 열 관리”// 1. 목표 프레임레이트 제한Application.targetFrameRate = 60; // 또는 30
// 2. 화면 꺼짐 방지 (필요 시만)Screen.sleepTimeout = SleepTimeout.NeverSleep;
// 3. 백그라운드 실행 중단void OnApplicationPause(bool paused) { if (paused) Time.timeScale = 0f; else Time.timeScale = 1f;}IL2CPP + 스트립핑
섹션 제목: “IL2CPP + 스트립핑”Project Settings → Player Scripting Backend: IL2CPP Managed Stripping Level: High
// 스트립핑 예외 처리// link.xml 파일 생성:<linker> <assembly fullname="MyAssembly" preserve="all"/></linker>프로파일링 워크플로우
섹션 제목: “프로파일링 워크플로우”// 1. Unity Profiler (Development Build + Autoconnect)// 2. Android GPU Inspector / Xcode Instruments// 3. Memory Profiler Package
// 코드 내 프로파일 마커using Unity.Profiling;static readonly ProfilerMarker s_marker = new("MyHeavyFunction");
void HeavyFunction() { using (s_marker.Auto()) DoWork();}- Render Scale 0.75~0.85로 화질/성능 균형
- ASTC 텍스처 압축 + 적절한 Max Size 설정
- Fixed Timestep 낮추기, LayerMask 최적화로 물리 비용 감소
targetFrameRate = 60+ 불필요한 포스트 이펙트 비활성화로 배터리 절약- IL2CPP + High Stripping으로 빌드 크기와 초기화 시간 단축