센로그

[Unity] Object Pool 본문

게임/Unity, C#

[Unity] Object Pool

seeyoun 2023. 6. 27. 11:28

◆ Object pool이란?

많이 사용되는 오브젝트들을 동적으로 생성/파괴하는 대신, 미리 pool에 담아놓고 필요할 때마다 꺼내 쓰는 방식.

custom allocator의 느낌.

동적으로 메모리 할당 시 발생하는 다양한 문제(시간, 메모리 파편화, 등...)를 해결하기 위한 방법.

게임에서는 실시간성을 확보해야 하기 때문에 특히 시간이 중요함!!

 


◆ Object pool의 사용

예를들어, 500명의 플레이어가 있는 게임에서, 총알 오브젝트를 생성/파괴한다고 하자.
최소한 500개의 총알이 실시간으로 만들어져야 한다!

■ object pool 미사용시
:생성시마다 Instantiate, 파괴시마다 Destroy를 호출해줘야 함.

동적으로 메모리를 할당 및 해제해야 한다는 뜻.

user↔kernel 모드 변경시 시간이 오래 걸리고, 새로운 메모리 할당/해제시 파편화 문제 발생할 수도 있음.

(pc의 경우 virtual memory 사용해서 괜찮다 하지만, 콘솔 등 다른 장치에서는 문제 발생)

 

 

■ object pool 사용시
:초기화할 때 미리 object들을 생성해놓고, 필요하면 꺼내 쓰고 다시 넣어두는 방식

Instantiate 대신 SetActive(true)를, Destroy 대신 SetActive(false)를 사용하는 방식.

새로운 메모리를 할당/해제하는 것이 아닌, 미리 할당한 메모리 내에서 사용하는 방식이라 파편화 X

 


Object pool 구현 방법

- 보통은 Singleton 패턴으로 PoolManager Instance를 만든 후, 런타임에 사용할 오브젝트들을 미리 만들어놓음.

- 미리 만든 오브젝트들은 비활성화하여 Queue 또는 Stack 등에 보관함

- 사용 요청을 받으면 꺼내주고(활성화, Dequeue), 다 쓴 오브젝트들은 반환(비활성화, Enqueue)하도록 함

- 만약 오브젝트를 전부 꺼내줬는데 사용 요청을 받은 경우, 새로운 오브젝트를 만들어서 꺼내줌. (또는 젤 먼저 꺼내줬던 오브젝트나, 특정 조건에 해당하는 오브젝트들을 다시 반환받은 후 꺼내줌)

Comments