유니티 가비지 컬렉션 최적화하기 2 – 번역

유니티에서 가비지 컬렉션 최적화하기 2

원문 링크

 

이전글 – 가비지 컬렉션 개요

가비지 컬렉션과 동반되는 문제 (Problems with garbage collection)

유니티의 메모리 관리 측면에서 가비지 컬렉션이 수행하는 역할을 살펴봤습니다.
이제, 가비지 컬렉션에 의해서 발생할 수 있는 문제를 살펴보겠습니다.

가장 명백한 문제는 가비지 컬렉터를 실행하는데 상당한 시간이 걸릴 수 있다는 점입니다.
가비지 컬렉터에서 검사해야하는 오브젝트 또는 오브젝트 참조값이 많은 경우, 이 많은 오브젝트들을 모두 검사하는 처리과정이 느려질 수 있습니다.
이로 인해 게임이 뚝뚝 끊기거나, 실행이 느려질 수 있습니다.

다른 문제는 가비지 컬렉터가 불필요한 시간에 실행될 수 있다는 점입니다.
CPU가 이미 성능이 매우 중요한 시점에서 열심히 작업을 처리하고 있는경우, 가비지 컬렉션에의해서 발생한 약간의 오버헤드(overhead)는 프레임 속도(frame rate)와 성능을 떨어뜨릴 수 있습니다.

힙 파편화(heap fragmentation)가 발생할 수 있다는 점 역시 문제가 될 수 있습니다.
힙 상에 메모리가 할당되면, 저장해야하는 데이터의 크기에 따라서 사용가능한 메모리 공간에서 크기가 서로 다른 메모리 블록(Memory block)단위로, 메모리를 차지합니다.

이러한 메모리 블록이 힙으로 반환되면, 힙은 할당된 메모리 블록으로 구분되는 여러 개의 작은 빈 블록으로 분할될 수 있습니다.
즉, 사용가능한 전체 메모리의 양이 많더라도, 가비지 컬렉터를 실행하거나 힙을 확장하지 않고서는, 기존 블록이 충분하지 않기 때문에 큰 메모리 블록을 할당할 수 없습니다.

힙 파편화는 2가지의 결과로 이어집니다. 첫째, 게임의 메모리 사용량이 게임에서 필요로하는 것보다 더 많아집니다. 둘째, 가비지 컬렉터가 더 자주 실행됩니다.

 

가비지 컬렉션에 의해서 발생하는 문제 진단 (Diagnosing problems with garbage collection)

가비지 컬렉션에 의해서 발생하는 성능 문제는 낮은 프레임 속도, 간헐적인 멈춤, 성능 저하 등으로 나타날 수 있습니다.
게임에 이런 성능 문제가 발생했을때 가장 먼저 해야할 일은, 유니티의 프로파일러(Profiler)를 이용해서 발생하는 문제가 실제로 가비지 컬렉션에 의한 것인지 확인하는 것입니다.

프로파일러를 이용해서 성능 문제의 원인을 찾는 방법은 이 강좌를 참고하시기 바랍니다.

프로파일러를 이용해서 게임을 살펴보고, 가비지 컬렉션에 의해서 문제가 발생한 경우, 계속해서 글을 읽어주세요.

 

힙 할당 찾기 (Finding heap allocations)

가비지 컬렉션에 의해서 문제가 발생된다는 점을 발견했다면, 작성한 코드의 어느 부분이 가비지(Garbage)를 생성하는지 이해해야합니다.
가비지는 힙 변수가 스코프를 벗어날때 생성되기때문에, 첫째로 힙에 변수를 할당하는 주체를 알아야합니다.

힙 상에 메모리을 할당하는 주체는 뭘까요?
유니티에서는, 값 타입의 로컬 변수는 스택에 할당되고, 나머지는 모두 힙에 할당됩니다.
값 타입과 참조 타입의 차이점에 대해서 잘 모르는 경우, 이 강좌를 참고하시기 바랍니다.

아래 예제는 스택 할당의 예입니다. localInt 변수는 로컬 변수이고 값 타입입니다. 이 변수를 위해서 할당된 메모리는, 이 함수의 실행이 종료되는 즉시 스택에서 해제됩니다.

void ExampleFunction()
{
    int localInt = 5;
}

아래 예제는 힙 할당의 예입니다. lovalList 변수는 로컬변수지만, 참조 타입입니다. 이 변수에 할당된 메모리는 가비지 컬렉터가 실행될때 해제됩니다.

void ExampleFunction()
{
    List localList = new List();
}

 

프로파일러를 사용해서 힙 할당 찾기 (Using the Profiler window to find heap allocations)

작성한 코드에서 힙 할당을 발생시키는 부분이 어딘지, 프로파일러를 이용해서 찾을 수 있습니다.

window_with_data copy

CPU 사용량을 보여주는 프로파일러가 선택된 상태에서, 프로파일러 창 하단의 특정 프레임을 선택해서, 해당 프레임에 대한 CPU 사용량 데이터를 확인할 수 있습니다. 데이터를 보여주는 열(column)에는 GC alloc이라고 이름 붙여진 열이 있습니다. 이 열(column)은 선택된 프레임에서 생성된 힙 할당을 보여줍니다. 컬럼 헤더(column header)를 선택하면, 통계를 통한 데이터 정렬이 가능합니다.

이를 통해서, 작성한 코드에서 어떤 함수가 힙 할당을 가장 많이 발생시키는지 쉽게 알 수 있습니다.
어떤 함수가 힙 할당을 잘생시키는지 확인하면, 해당 함수를 검사할 수 있습니다.

해당 함수의 어떤 코드가 가비지를 생성하는지 찾았다면, 문제를 해결할 방법을 결정하고, 생성되는 가바지의 양을 최소화할 수 있습니다.

 

내용 끝까지 읽어주셔서 감사합니다.

배너 클릭은 저에게 많은 힘이 됩니다.

감사합니다 🙂

 

다음글 – 가비지 컬렉션에 의한 피해 줄이기

RonnieJ

프리랜서 IT강사로 활동하고 있습니다. 게임 개발, C++/C#, 1인 기업에 관심이 많습니다.

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

Please turn AdBlock off

Notice for AdBlock users

Please turn AdBlock off