Edit > Project Settings > Audio에서DSP Buffer Size를Best latency로 설정 - Best Performance : 성능이 우선 되어 출력 시 지연이 발생할 수 있음 - Best latency : 지연이 발생하지 않는 것을 우선시하여 출력 품질이 저하될 수 있음
리소스 타입별 세팅
배경음 1 - Force To Mono : 언 체크(퀄리티에 따라 가변) - Load In Background : 체크 - Load Type : Streaming - Preload Audio Data : 언 체크 - Compression Format : Vobis (100%)
배경음 2 - Force To Mono : 언 체크(퀄리티에 따라 가변) - Load In Background : 체크 - Load Type : Compressed In Memory - Preload Audio Data : 언 체크 - Compression Format : Vobis (70%)
효과음 : 작은 크기의 빈번한 출력 - Force To Mono : 체크 - Load In Background : 언 체크 - Load Type : Decompress On Load - Preload Audio Data : 체크 - Compression Format : PCM
긴 효과음(보이스) : 중간 크기의 빈번한 출력 - Force To Mono : 체크 - Load In Background : 언 체크 - Load Type : Compressed In Memory - Preload Audio Data : 체크 - Compression Format : ADPCM
작은 크기의 가끔 발생하는 Sound - Force To Mono : 체크 - Load In Background : 언 체크 - Load Type : Compressed In Memory - Preload Audio Data : 언 체크 - Compression Format : ADPCM
중간 크기의 가끔 발생하는 Sound - Force To Mono : 체크 - Load In Background : 언체크 - Load Type : Compressed In Memory - Preload Audio Data : 언 체크 - Compression Format : Vobis (70%)
개별 리소스 세팅 정보
Force To Mono(모노 강제조정) - 스테레오를 모노로 강제 조정 - 모바일이고 최적화를 중시할 경우 설정(체크) 함
Load In Background(지연된 로딩) - 체크 시 출력 타이밍을 엄격히 지키지 않고, 느긋하게 백그라운드에서 로드 - 따라서 배경음악일 경우 사용 FX 사운드의 경우 체크 해제
Load Type - Decompress On Load 실행과 동시에 압축을 해제 작은 사이즈의 FX 사운드에 유용 많은 메모리 점유 CPU는 적게 사용
- Compressed In Memory 메모리에 압축 상태로 저장, 실행 시 압축을 해제하여 재생 약간의 성능상 오버헤드를 발생시킴 보이스 사운드 등에 사용
- Streaming 저장소에 위치한 오디오를 실시간으로 읽어냄. 보통 배경음악에서 사용
Preload Audio Data - 씬이 로딩될 때 씬에서 사용하는 모든 오디오 클립을 미리 로드 - 언체크시 플레이시 로드 하기에 랙 발생 됨
Compression Format - PCM 최고품질 / 용량 큼 / 작은 파일 크기에 적합 / FX 사운드 Load Type은 Decompress On Load로 하자 즉시 재생해야 하는 매우 짧은 효과음
- ADPCM 중간 품질 / 용량 중간 PCM대비 3.5배의 압축비, 노이즈가 포함됨 총격 소리와 같이 무압축에 가까운 품질 까지는 필요없지만, 지연시간 없이 자주 반복 재생 되야 하는 경우 적절
- Vobis 최저품질 / 용량 적음 / 배경음에 적합 압축률 설정이 가능(보통 70%로 설정) 지연 재생 되어도 무방한 일반적인 배경음
Integrated Success 팀은 유니티 고객들이 복잡한 기술적 문제를 해결할 수 있도록 지원합니다. 유니티의 선임 소프트웨어 엔지니어로 구성된 이 팀과 함께 모바일 게임 최적화에 관한 전문적인 지식을 공유하는 자리를 마련했습니다.
유니티의 엔진 소스 코드를 완벽하게 파악하고 있는Accelerate Solutions팀은 Unity 엔진을 최대한 활용할 수 있도록 수많은 고객을 지원합니다. 팀은 크리에이터 프로젝트를 심도 있게 분석하여 속도, 안정성, 효율성 등을 향상시키기 위해 최적화할 부분을 파악합니다.
모바일 게임 최적화에 관한 인사이트를 공유하기 시작하면서, 원래 계획한 하나의 블로그 포스팅에 담기에는 너무나 방대한 정보가 있다는 사실을 알게 되었습니다. 따라서 이 방대한 지식을 한 권의 전자책(여기에서 다운로드 가능)과 75가지 이상의 실용적인 팁을 담은 블로그 포스팅 시리즈를 통해 제공하기로 했습니다.
이번 시리즈의 두 번째 포스팅에서는 UI, 물리, 오디오 설정을 통해 성능을 개선하는 방법을 자세히 살펴봅니다.이전 포스팅에서는 프로파일링, 메모리, 코드 아키텍처에 대해 다뤘으며, 다음 포스팅에서는 에셋, 프로젝트 구성, 그래픽스에 대해 다룰 예정입니다.
Auto Sync Transforms를 비활성화하고Reuse Collision Callbacks를 활성화합니다.
물리 프로젝트 설정을 수정하여 성능 향상확장
프로파일러의 Physics 모듈을 살펴 성능 문제 확인확장
콜라이더 단순화
메시 콜라이더는 많은 리소스를 요합니다. 복잡한 메시 콜라이더를 기본 또는 단순화된 메시 콜라이더로 대체하여 원래 모양을 대략적으로 표현하세요.
콜라이더에 기본 또는 단순화된 메시 사용확장
물리 메서드를 사용하여 리지드바디 이동
MovePosition또는AddForce와 같은 클래스 메서드를 사용하면Rididbody오브젝트를 이동할 수 있습니다.트랜스폼컴포넌트를 직접 변환하면 물리 월드에서 다시 계산하게 되어, 복잡한 씬의 경우 리소스를 많이 소모합니다.Update대신FixedUpdate에서 물리 바디를 이동시킵니다.
Fixed Timestep 고정
Project Settings에서Fixed Timestep의 기본값은 0.02(50Hz)입니다. 이를 목표 프레임 속도와 일치하도록 변경합니다(예: 30fps는 0.03).
만약 런타임에서 프레임 속도가 하락하면 Unity가 프레임당FixedUpdate를 여러 번 호출하게 되어 물리가 많이 사용된 콘텐츠에서 CPU 성능 문제를 유발할 수 있습니다.
Maximum Allowed Timestep은 프레임 속도가 하락하는 경우 물리 계산 및 FixedUpdate 이벤트가 사용할 수 있는 시간의 양을 제한합니다. 이 값을 낮추면 성능 문제 발생 시 물리 및 애니메이션이 느려지도록 하여 프레임 속도에 미치는 영향을 줄일 수 있습니다.
Fixed Timestep을 목표 프레임 속도와 일치하도록 수정하고 Maximum Allowed Timestep를 낮춰 성능 결함 방지확장
Physics Debugger를 통한 시각화
Physics Debug 창(Windows > Analysis > Physics Debugger)을 사용하면 콜라이더나 불일치로 인한 문제를 해결할 수 있습니다. 이 창은 서로 충돌할 수 있는 게임 오브젝트를 색으로 구별하여 표시합니다.
UGUI(Unity UI)는 성능 문제의 원인이 되는 경우가 많습니다. Canvas 컴포넌트는 UI 요소에 대한 메시를 생성 및 업데이트하고 GPU에 드로우 콜을 보냅니다. 이러한 기능은 리소스를 많이 소모할 수 있으므로 UGUI를 사용할 때 다음 사항을 기억하세요.
Canvas 나누기
수천 개의 요소가 포함된 하나의 대형 Canvas에서는 UI 요소를 하나만 업데이트해도 전체 Canvas가 강제로 업데이트되므로 CPU 스파이크가 발생할 수 있습니다.
다수의 Canvas를 지원하는 UGUI의 기능을 활용하세요. 새로 고침해야 하는 빈도에 따라 UI 요소를 나눕니다. 정적 UI 요소는 별도의 Canvas에 두고, 동시에 업데이트되는 동적 요소는 보다 작은 하위 Canvas에 둡니다.
각 Canvas 내의 모든 UI 요소가 동일한 Z 값, 머티리얼, 텍스처를 갖도록 해야 합니다.
보이지 않는 UI 요소 숨기기
게임에서 간헐적으로만 나타나는 UI 요소(예: 캐릭터가 대미지를 입었을 때 나타나는 체력 표시줄)가 있을 수 있습니다. 보이지 않는 UI 요소가 활성화된 경우에도 드로우 콜을 사용할 수 있습니다. 보이지 않는 UI 컴포넌트를 명시적으로 비활성화하고 필요할 때 다시 활성화합니다.
Canvas의 가시성만 해제하면 되는 경우 게임 오브젝트 대신 Canvas 컴포넌트를 비활성화합니다. 이렇게 하면 메시와 버텍스를 재구성하지 않아도 됩니다.
GraphicRaycaster를 제한하고 Raycast Target 비활성화하기
GraphicRaycaster컴포넌트는 화면 터치나 클릭과 같은 입력 이벤트에 필요합니다. 이 컴포넌트는 화면의 각 입력 지점을 순환하며 입력 지점이 UI의 RectTransform 내에 있는지 확인합니다.
계층 구조의 맨 위쪽 Canvas에서 기본GraphicRaycaster를 제거하세요. 대신, 상호 작용이 필요한 개별 요소(버튼, Scrollrect 등)에만GraphicRaycaster를 추가합니다.
기본적으로 활성화되어 있는 Ignore Reversed Graphics 비활성화확장
아울러 모든 UI 텍스트 및 이미지에서 불필요하게 활성화된Raycast Target도 비활성화합니다. UI에 많은 요소가 있어 복잡한 경우 이와 같이 간단히 설정을 변경하여 불필요한 계산을 줄일 수 있습니다.
가능한 경우 Raycast Target 비활성화확장
Layout Group
Layout Group은 비효율적으로 업데이트되므로 반드시 필요할 때만 사용하세요. 콘텐츠가 동적이지 않은 경우 Layout Group을 아예 사용하지 말고, 비율 레이아웃에 앵커를 대신 사용하시기 바랍니다. 그 밖의 경우에는 UI 설정을 마친 후 커스텀 코드를 생성하여Layout Group컴포넌트를 비활성화합니다.
동적 요소에 Layout Group(Horizontal, Vertical, Grid)을 사용해야 하는 경우, 중첩되지 않도록 하여 성능을 개선합니다.
중첩된 경우 특히 성능을 하락시키는 Layout Group확장
대형 리스트 뷰와 그리드 뷰 사용 시 주의
대형 리스트 뷰와 그리드 뷰는 많은 리소스를 소모합니다. 대형 리스트 또는 그리드 뷰(예: 수백 개의 항목이 있는 인벤토리 화면)를 만들어야 하는 경우 항목마다 UI 요소를 만드는 대신 소규모 UI 요소의 풀을 재사용하는 것이 좋습니다. 샘플GitHub 프로젝트를 통해 실제 작동 모습을 확인하세요.
요소의 과도한 레이어링 주의
다수의 UI 요소를 레이어링하면(예: 카드 시합 게임에서 쌓여 있는 카드) 오버드로우가 발생합니다. 코드를 커스터마이즈하여 런타임에 레이어링된 요소를 병합하여 요소나 배치(batch)의 수를 줄이세요.
다양한 해상도 및 종횡비 사용
현재 모바일 기기에서 사용 중인 해상도와 화면 크기가 매우 다양하므로, 각 기기에서 최상의 경험을 제공하는대체 버전의 UI를 만드세요.