본문 바로가기

유니티

[유니티] 오브젝트 풀링 Object pooling에 대해서 알아보자

오브젝트 풀링은, 게임 내에서 계속해서 재활용되는 오브젝트들을 Instantiate/Destroy 하지 않고, 컨테이너에 그 오브젝트들을 넣은 후 SetActive를 통해서 오브젝트의 생성,파괴를 연출하는 방법이다.

 

오브젝트가 생성되고 파괴될 때  Instantiate/Destroy를 사용하게 되면 성능 소모와 프레임 저하가 발생할 수 있기 때문이다.

 


코드

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class ObjectPooling : MonoBehaviour
{
    [SerializeField] private GameObject objectPrefeb;
    Queue<GameObject> ObjectPool = new Queue<GameObject>(); //오브젝트를 담을 큐
    public static ObjectPooling instance = null;

    void Awake()
    {
        if (null == instance)
        {
            instance = this;
            DontDestroyOnLoad(this.gameObject);
            for (int i = 0; i < 30; i++)
            {
                CreateObject(); //초기에 30개의 오브젝트를 생성함
            }
        }
        else
        {
            Destroy(this.gameObject);
        }
    }
    GameObject CreateObject() //초기 OR 오브젝트 풀에 남은 오브젝트가 부족할 때, 오브젝트를 생성하기위해 호출되는 함수
    {
        GameObject newObj = Instantiate(objectPrefeb,instance.transform);
        newObj.gameObject.SetActive(false);

        return newObj;
    }
    public GameObject GetObject() //오프젝트가 필요할 때 다른 스크립트에서 호출되는 함수
    {
        if (ObjectPool.Count > 0) //현재 큐에 남아있는 오브젝트가 있다면,
        {
            GameObject objectInPool = ObjectPool.Dequeue();

            objectInPool.gameObject.SetActive(true);
            objectInPool.transform.SetParent(null);
            return objectInPool;
        }
        else //큐에 남아있는 오브젝트가 없을 때 새로 만들어서 사용
        {
            GameObject objectInPool = CreateObject();

            objectInPool.gameObject.SetActive(true);
            objectInPool.transform.SetParent(null);
            return objectInPool;
        }
    }
    public void ReturnObjectToQueue(GameObject obj) //사용이 완료 된 오브젝트를 다시 큐에 넣을때 호출 파라미터->비활성화 할 오브젝트
    {
        obj.gameObject.SetActive(false);
        obj.transform.SetParent(instance.transform); 
        instance.ObjectPool.Enqueue(obj); //다시 큐에 넣음
    }
}

 


오브젝트 풀링 방법은 초기에 메모리를 할당해야 하기 때문에, 메모리적인 부분에서 희생을 하게 되지만, 그 이후에 성능적으로 프레임 차이가 그냥 생성/파괴하는것보다 훨씬 좋아지기 때문에 사용이 된다.

특히나 오브젝트가 많으면 많을수록 더 효과가 있는 방법이다.