Memory - 모바일 게임 성능 최적화 팁 (2)
Unity 공식 document인 "Optimize your mobile game performance" 를 정리한 내용입니다.
1. 개요
Unity는 자동 메모리 관리를 사용한다.
값이 입력된 로컬 변수처럼 작은 데이터는 Stack에 할당된다. 큰 데이터와 장기 Storage는 Heap에 할당된다.
Stack과 Heap을 간략히 설명하면 다음과 같다.
Stack | Heap | |
Memory 할당 | 자동 | 직접 할당 |
Memory 해제 | 자동 | 직접 해제 or GC가 해제 |
속도 | 빠른편 | 상대적으로 느림 (단편화) |
용도 | 지역 변수, 매개 변수 | 동적 객체나 배열 |
Memory 구조 | ![]() |
가비지 컬렉터(GC)는 사용되지 않은 Heap 메모리를 주기적으로 파악하여 할당을 해제한다.
Unity에서 이 작업은 자동으로 실행되지만,
Heap의 모든 개체를 검사하는 과정에서 게임이 끊기거나 느리게 실행될 수 있다.
Memory 사용량을 최적화하려면 Heap 메모리의 할당 및 해제 시점뿐 아니라
GC의 영향을 최소화 하는 방법을 알아야 한다.
2. Memory 최적화
Memory를 최적화 하는 방법은 다음과 같이 기재되어 있다.
- Memory Profiler 사용
- GC 의 영향 줄이기
- 가능한 경우 가비지 컬렉션 측정
- Incremental GC를 사용하여 GC 워크로드 분할
Memory Profiler 사용
Memory Profiler를 사용하면 Heap 메모리의 스냅샷을 캡처하여 단편화 및 메모리 누수를 파악할 수 있다.
Memory Profiler는 Package Manager에서 Install 할 수 있다.
GC의 영향 줄이기
Unity는 Boehm-Demers-Weiser 가비지 컬렉터를 사용하며,
이 컬렉터는 프로그램 코드의 실행을 중단하고 작업이 완료될 때만 실행을 재개한다.
Heap의 불필요한 할당은 GC 스파이크를 유발할 수 있으므로 유의해야 한다.
예시 | |
문자열 | C#에서 문자열은 값 유형이 아닌 참조 유형이다. JSON, XML과 같은 문자열 기반 데이터 파일보다 ScriptableObjects 또는 MessagePack, Protobuf같은 형식으로 저장한다. Runtime에서 문자열을 빌드해야 하는 경우 StringBuilder 클래스를 사용한다. |
Unity 함수 호출 | 일부 함수는 Heap 할당을 생성한다. 그러므로 가비지 생성을 방지하는 함수를 활용하자. 예를들어 문자열을 GameObject.tag와 직접 비교하는 대신 GameObject.CompareTag를 사용하는 방법이 있다. |
박싱 | 박싱( 값 형식을 참조 형식으로 )이 일어나면 가비지가 생성되므로 사용을 지양한다. int x = 123 object o = x |
코루틴 | yield는 가비지를 생성하지 않지만 새로운 WaitForSeconds 오브젝트를 만들면 가비지가 생성된다. 따라서 yield 라인에서 생성하는 대신 WaitForSeconds 오브젝트를 캐시하고 재사용한다. |
LINQ 및 정규식 | 두 가지 모두 박싱에서 가비지를 생성하므로 사용을 지양한다. |
가능한 경우 가비지 컬렉션 측정
Memory 회수가 필요하다면 System.GC.Collect로 가비지 컬렉션을 수행할 수 있지만, 성능에 문제가 될 수 있으니 주의한다.
Incremental GC를 사용하여 GC 워크로드 분할
Incremental GC를 사용하면 Program 실행 중에 한 번 길게 중단되는 것이 아니라 훨씬 짧은 중단이 여러 프레임에 걸쳐 여러번 발생한다.
cpdm
choppadontbiteme.tistory.com
'Dev > Unity' 카테고리의 다른 글
[Unity] Project 구성 - 모바일 게임 성능 최적화 팁 (4) (0) | 2024.07.19 |
---|---|
[Unity] Programming & Code Architecture - 모바일 게임 성능 최적화 팁 (3) (0) | 2024.07.19 |
[Unity] Profiling 프로파일링 - 모바일 게임 성능 최적화 팁 (1) (1) | 2024.07.19 |
[Unity] apk 설치 에러 INSTALL_FAILED_NO_MATCHING_ABIS (0) | 2024.02.09 |
[Unity] 게임 화면 세로 방향으로 지정하기 Portrait display (0) | 2024.02.03 |