내일배움캠프 TIL

내일배움캠프 27일차 TIL "오브젝트 풀링"

Jooglorystar 2024. 10. 22. 21:00

 

 

기본적으로 유니티에선 Instantiate() 메서드를 이용해 오브젝트를 생성하거나, Destory()메서드를 이용해 오브젝트를 파괴할 수 있다.

 

그러나 이러한 생성과 파괴는, 리소스를 꽤 많이 소모하는 작업이며, 파괴된 오브젝트가 메모리 할당에서 사라지더라도, 카비지 컬렉터 작업이 빈번해져 성능저하를 유발할 수 있다.

 

해당 오브젝트가 한 두개만 사용된다면 큰 문제가 없을 수도 있지만, 문제는, 수십, 수백개의 다량의 오브젝트가 필요한 경우이다.

슈팅게임에서의 총알이나, 디펜스 게임의 몬스터들이 예시가 될 수 있을 것이다. 

 

그 점을 해결할 수 있는 것이 오브젝트 풀링(Object Pooling)이다. 

오브젝트 풀링은 기본적으로 오브젝트를 오브젝트 풀에 미리 생성해 두고, 필요할 때 활성화하고, 필요하지 않으면 비활성화하여 관리하는 최적화 기법 중 하나이다.

 

다음은 오브젝트 풀의 간단한 예시이다.

 

public class ObjectPool : MonoBehaviour
{
    public GameObject prefab;
    private List<GameObject> pool = new List<GameObject>();
    public int poolSize = 300;

    void Awake()
    {
        for (int i = 0; i < poolSize; i++)
        {
            GameObject obj = Instantiate(prefab, transform);
            pool.Add(obj);
            obj.SetActive(false);
        }
    }

    public GameObject Get()
    {
        GameObject obj = null;
        for (int i = 0; i < poolSize; i++)
        {
            if(!pool[i].activeSelf)
            {
                pool[i].SetActive(true);
                obj = pool[i];
            }
        }
        return obj;
    }
}

 

 

Awake에서 어떤 특정 prefab을 생성하고 리스트에 넣으며 비활성화 한다.

사용할 일이 있으면, 비활성화되어있는 오브젝트를 하나 활성화하는 식의 구현이다.

본 코드는 더이상 활성화 시킬 리스트가 없다면 생성을 하지는 않는다.