오브젝트 풀링

개체를 할당하고 파괴하는 대신, 미리 오브젝트 집합(Object Pool)을 생성하고

필요할 때 불러와 사용한 뒤 사용한 개체를 다시 개체 집합에 반환하여 개체들을 재사용하는 디자인 패턴.

 

오브젝트 풀링을 사용하는 큰 이유 중 하나는 메모리 단편화의 발생으로,

Instantiate와 Destroy를 사용하다 보면 메모리에 빈 공간이 이곳 저곳 생기게 되고, 외부 단편화가 발생하게 된다.

이를 방지하기 위해 오브젝트 풀링을 사용하여 메모리를 효율적으로 관리하는 것이 좋다.

또한 보통의 C#에서는 GC가 메모리 단편화를 Compaction을 통해 해결하지만,

유니티의 GC는 Compaction 기능일 지원하지 않기 때문에 메모리 단편화를 해결하지 못한다.

 

또 미리 생성된 개체를 재사용하므로 개체를 생성하고, 파괴하는데 드는 시간 및 비용의 낭비를 줄인다.

오브젝트 생성 및 파괴는 자원의 낭비가 심한데다가 오브젝트 파괴의 경우 가비지 컬렉션을 호출하게 된다.

가비지 컬렉션은 시스템에서 자동으로 호출되며, 수집 과정은 상당한 CPU 시간과 자원을 요구한다.

 

한 번만 사용하는 오브젝트는 Destroy()를 호출하여 파괴하면 되지만,

여러 번 반복적으로 사용하게 되는 오브젝트는 오브젝트 풀링을 사용하는 것이 최적화에 좋다.

ex) 총알과 같이 반복되어 사용되는 오브젝트

 


동작방식

오브젝트 풀링은 미리 생성하고 이를 반복적으로 사용하는 것이다.

따라서 오브젝트 재사용은 큐를 사용하여 (호출 -> 사용 -> 반납)의 과정을 반복하게 된다.

 


오브젝트 풀링 구현

1. 재사용 오브젝트(Poolable Object).

재사용할 게임 오브젝트는 활성화가 되면 기능을 수행하고,

수행이 종료되면 비활성화 되어 오브젝트 집합으로 돌아가게 된다.

 

2. 오브젝트 집합 (Object Pool)

풀은 재사용 오브젝트의 프리팹을 사용해 시작 시 재사용 오브젝트의 인스턴스를 생성한다.

지정된 개수 만큼 인스턴스를 생성하여 오브젝트의 Pool을 만든 뒤

큐를 이용하여 호출된 오브젝트를 활성화 하고, 사용 후 반납된 오브젝트를 비활성화 한다.

 

'Unity' 카테고리의 다른 글

[Unity] 업데이트와 코루틴  (0) 2021.11.22
[Unity] Project_ShootingRun  (0) 2021.11.01

+ Recent posts