프로그래밍에서 많은 오브젝트를 생성하고 파괴하면 오브젝트 수에 따라 많은 성능소모와 CPU에 부담이 생기게됩니다.
이때 최적화 기법 오브젝트 풀링으로, 생성한 오브젝트들을 풀(큐,리스트, 스택)에 미리 담아 관리하여 프레임 저하를 방지할 수 있습니다.
따라서 오브젝트 풀링은 비활성화된 오브젝트들을 미리 생성한 후 활성화,비활성화를 사용해 재활용하여 메모리를 효율적으로 사용하는 기법입니다.
오브젝트 풀링 사용 방법
- 사용할 오브젝트 미리 (비활성화 상태로) 생성 , 모두 Queue 삽입
- 오브젝트 사용할 때 - Queue에서 삭제, 오브젝트 활성화
- 오브젝트 버릴 때 - 다시 Queue 삽입, 오브젝트 비활성화
먼저 PoolingManager 스크립트를 작성해줍니다.
public class EnemyPoolingManager : MonoBehaviour
{
//싱클톤 구현
public static EnemyPoolingManager instance;
public GameObject Enemy_Prefabs = null; //생성 오브젝트
public Transform[] spawnPos = new Transform[2]; //스폰장소
public Queue<GameObject> queue = new Queue<GameObject>();
int rand_Pos; //랜덤스폰장소
void Start()
{
instance = this;
for (int i = 0; i < 100; i++)
{
rand_Pos = Random.Range(0, 2);
//오브젝트 생성 후 비활성화, Enqueue
GameObject t_object = Instantiate(Enemy_Prefabs, spawnPos[rand_Pos].position, Quaternion.identity);
queue.Enqueue(t_object);
t_object.SetActive(false);
}
}
//오브젝트 버릴 때
public void InsertQueue(GameObject Enque_Obj)
{
queue.Enqueue(Enque_Obj);
Enque_Obj.SetActive(false);
}
//오브젝트 사용할 때
public GameObject GetQueue()
{
GameObject Deque_Obj = queue.Dequeue();
Deque_Obj.SetActive(true);
return Deque_Obj;
}
}
다음은 오브젝트를 스폰할 spawnManager스크립트 작성해줍니다.
public class Enemy_SpawnManager : MonoBehaviour
{
public Transform[] spawnPos = new Transform[2];
int randNum;
void Start()
{
StartCoroutine(CreateCoroutine());
}
IEnumerator CreateCoroutine()
{
while (true)
{
yield return new WaitForSeconds(0.1f);
GameObject Enque_Obj = EnemyPoolingManager.instance.GetQueue();
randNum = Random.Range(0,2);
Enque_Obj.transform.position = spawnPos[randNum].position;
}
}
}
마지막으로 오브젝트를 다 사용하고 삭제와 같은 기능코드입니다.
오브젝트 풀링을 사용할 땐 삭제 대신 비활성화를 통해 재활용한다.
void is_Dead()
{
if (Mons_curHp <= 0)
{
//충돌 시 비활성화
EnemyPoolingManager.instance.InsertQueue(gameObject);
}
}
개발자로서 배울 점이 많은 글이었습니다. 감사합니다.