총알이나 화살을 사용하는 게임을 제작하다보면 그에관한 Prefab 파일들을 Instantiate로 복사하여 발사하는 과정을 거친다. 하지만 총알같은 Prefab Clone 파일들은 Destroy 처리를 해주지 않으면 파괴되지 않고 어디선가 계속 메모리를 차지하고 있다.
여기서 문제점은 Destroy 기능이 굉장히 많은 비용을 소모한다는 것이다. 그렇기 때문에 게임 성능이 저하되어 프레임 드랍이 일어날 수 있다. 그래서 이러한 문제점을 해결해줄 수 있는 방법인 오브젝트 풀링에 대해 알아보려고 한다.
Object Pooling이란?
자주 사용하는 오브젝트를 오브젝트 풀에 미리 생성해놓고 사용할 때마다 생성, 삭제하는 것이 아닌
오브젝트 풀에서 빌려와서 사용하고 다 사용했다면 다시 오브젝트 풀에 값을 넣어주는 것이다.
그래서 Destroy를 사용할 필요가 없기 때문에 게임의 최적화적인 면에서 굉장히 유리하다.
사용법
처음봤을 땐 굉장히 복잡해보일 수 있지만 차근차근 설명하고자 한다.
우선 이 코드는 인식할 수 있는 태그, 사용할 프리팹, 프리팹을 얼마나 복제할 것인지에 대한
사이즈를 구조체로 만들어서 리스트의 타입으로 사용한다.
태그는 키 값으로 사용하고 게임오브젝트 형 Queue를 Value로 받는 Dictionary를 선언한다.
Awake 가 실행된다면 Dictionary와 오브젝트 풀을 담당할 Queue를 선언한다.
그리고 사용자가 지정한 List의 값 중 size값만큼 반복문을 실행한다.
size만큼 사용자가 설정한 Prefab값을 Instantiate로 복사 해준다.
아직 사용하기 전 상태를 만들기 위해 obj를 false로 꺼준다
이제 복사하고 SetActive를 꺼준 obj를 오브젝트 풀에 넣어준다.
모든 값을 넣은 오브젝트 풀과 키값을 Dictionary에 넣어준다 -> 재사용하기 위함
아래의 SpawnFromPool 함수를 분석해보자
우선 Dictionary에 포함된 태그 값이 아니면 null 처리를 해준다.
정상적으로 들어왔다면 obj에 값을 하나 Dequeue해준다.
그리고 다시 Dictionary에 Enqueue 해준다.
그리고 Dequeue한 obj 값을 반환해준다.
글씨를 굵게 처리한 이 부분이 오브젝트 풀을 사용하는 이유라고 할 수있다.
오브젝트를 사용하고 다시 반환해주는 과정이 있기때문에 최적화면에서 성능이 뛰어나다고 할 수 있다.
회고
물론 내가만드는 게임들이 엄청나게 큰 프로젝트가 아니기 때문에 Destroy로도 충분히 해결할 수 있다.
하지만 이러한 부분들에대한 기술들을 익혀나가면 나중에 정말 큰 프로젝트를 담당할 때 큰 도움이
될 것이라고 생각한다. 오브젝트 풀링뿐만 아니라 다른 다양한 방법들도 찾아서 공부해봐야 겠다.