본문 바로가기

Dev/Unity

[Unity] Memory - 모바일 게임 성능 최적화 팁 (2)

반응형

 

 


 

 

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

 

반응형