Object Pooling 패턴

[Unity] Object Pooling 개요

게임 속 플레이어가 몬스터를 처치하기 위해 총알을 발사한다고 한다면 총알을 생성하고 총알을 삭제하는 작업이 반복될 것입니다.

프레임 속도를 유지하면서 CPU에 부담을 주지 않으려면 빈번하게 파괴되고 생성되는 요소들을 메모리에 할당해두고 있는 것이 좋습니다.

오브젝트를 미리 생성해두었다가 필요할 때에 사용하고 다시 되돌려놓는 방법을 Object Pooling 패턴이라고 합니다.


Object Pooling의 작동원리

  1. 컨테이너 형식의 풀은 초기화된 오브젝트 목록을 메모리에 남겨둡니다.

  2. 사용자는 사용할 오브젝트 인스턴스를 Pool에 요청할 수 있습니다.

  3. 만약 주어진 시간 내에 풀 내의 인스턴스가 충분하지 않다면 새로운 인스턴스가 동적으로 생성됩니다.

  4. 풀을 빠져나간 객체 중 클라이언트에서 더 이상 사용되지 않게되면 풀로 돌아가게 됩니다.

  5. 이 때, 풀에 공간이 없다면 돌아오려는 객체의 인스턴스를 파괴합니다.


장단점

Object Pooling 패턴에 대해서는 여러 개발자마다 입장이 다릅니다.

패턴을 사용할 경우 장단점은 어떤 것이 있을까요?

장점

  1. 메모리 사용률이 예측 가능합니다. 풀을 생성할 때 풀 안에 생성될 오브젝트의 갯수를 미리 지정해두기 때문에 메모리를 어느만큼 사용할지 예측이 가능합니다.

  2. 오브젝트를 Instantiate, Destroy하는 과정에서 가비지 콜렉터를 호출하게 되면서 프레임 드랍이 발생하는데 해당 작업의 빈도가 줄어들게 됩니다.

단점

  1. 메모리를 사용하지 않는 상황에도, 기본적으로 메모리의 공간을 할당하고 있습니다.

  2. 초기화의 번거로움이 존재합니다. 오브젝트 풀링을 사용할 경우 초기화 코드를 작성해주어야 합니다.


장점만 가지고 있는 패턴은 없는 것 같습니다. 그러므로 상황에 따라 신중하게 패턴을 사용할지 말지 결정해야합니다.

최적화가 필요한 시점에 어떤 부분에 적용을 시키는 것이 효율이 좋을지 검토해보는 것이 좋을 것 같습니다.