콘텐츠로 이동

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
iOSASTC
Project Settings → Player → Android
Texture Compression: ASTC (권장)
텍스처 Import Settings:
Max Size: 1024 (UI), 512 (소품)
Generate Mip Maps: 3D 오브젝트만 활성화
// 1. 씬 전환 시 명시적 GC
async 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;
}
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으로 빌드 크기와 초기화 시간 단축