DNF LOVE

[Unity 3D 제3장 슈팅게임 - 1] Unity의 대표적인 최적화 방법, Object Pooling 본문

Programming/Unity

[Unity 3D 제3장 슈팅게임 - 1] Unity의 대표적인 최적화 방법, Object Pooling

botho 2019. 10. 3. 20:47
반응형

이번에 진행할 Unity Project는 2.5D로 되어있는 비행기 슈팅 게임이다.

프로젝트를 진행하기 전에, Unity의 대표적인 최적화 방법인 Object Pooling을 소개하도록 하겠다.


[Object의 데이터가 적재되는 메모리, Heap]

이전 포스터 중, 메모리 구조에 대한 글을 쓴 적이 있다. Click

보통 Unity에서 Object들을 생성하고 관리하는 것은 동적 할당의 영역인 Heap 에 데이터가 적재된다.

메모리는 한계를 가지고 있는 자원이기 때문에, Heap에 데이터가 쌓이게 되면 그 프로그램의 성능이 떨어지게 된다.

이번 슈팅 게임으로 예를 들면, 보통 유저들이 슈팅게임을 할 때 방향키로 비행기의 좌우를 조절하며 공격키는 연속발사를 하게 된다.

보통으로 구현하는 Object를 생성 / 삭제로 구현하여 버튼을 누르면 Heap 메모리 영역에 Object의 데이터를 적재하고, Enemy와 부딪치거나 시간이 지나면 해당 Object에 매핑되어 있는 메모리를 반환하며 해당 Object는 삭제된다.

그렇지만 여기서 공격키를 무수히 눌렀다면? 메모리 할당 요청 예약이 Heap에 계속적으로 쌓이게 되며 Stack영역을 침범하는 Heap Overflow가 발생된다. 이렇게 되면 공격키를 누른 순간에 발사체가 생성되는 것이 아니라, 공격키를 누른 다음 해당 메모리 할당을 수행할때까지 delay가 발생되며 프로그램의 성능은 떨어지게 된다.

보통 이렇게 해당 힙 영역을 사용하지 못한 현상을 메모리 누수 현상이라 한다. 이 누수 현상으로 인한 영역의 값들을 Garbage라 부른다. 개발자가 직접적으로 메모리를 관리하는 C와 C++과 다르게 C#은 이런 쓰레기값들을 관리하는 Garbage Collection(이해 GC)을 지원해준다. GC는 메모리에 참조가 끝난 객체들을 쓰레기장에 치우듯 메모리에서 소멸시키는 일을 한다.

그러나 Garbage Collection또한 CPU 연산량에 영향을 받으며 만능은 아니다. CPU연산량이 많아 GC의 연산이 늦춰진다면 이 역시 Delay가 발생되며 프로그램 성능이 저하된다.

그렇다면 어떻게 해야할까? 최고의 방법은 이런 GC가 지속적으로 쌓이지 않게 최적화를 하는 방법이다.

Unity에서 자주 사용하는 대표적인 최적화의 방법은 Object Pooling기법이다.


[Object Pooling이란?]

앞서 설명했듯, Object를 생성(Instantiate)과 삭제(Destroy)시 GC의 호출 렉을 발생시킨다. 그렇다면 이 Object를 생성과 삭제를 반복하며 메모리를 지속적으로 적재 및 반환을 반복하는 것이 아닌, 몇개의 Object를 미리 메모리에 적재한 후 이 Object들을 활성/비활성으로 재사용하여 GC가 발생되지 않도록 최적화 하는 방법이다.

즉, Object를 생성, 삭제를 반복하는 것이 아닌, 활성과 비활성을 반복하는 기법이다.

자세한 사용 예시는 프로젝트를 진행하면서 보충하도록 하겠다.

반응형