본문 바로가기
개발/Unity

[Unity] Object Pool

by 김뜬뜬 2026. 3. 24.

안녕하세요 주인장입니다.

 

요즘 들어 문득 스스로를 돌아보게 되는 순간이 많아졌습니다. 무언가를 계속 쌓아가고 있다고 생각했는데, 정작 가장 중요한 ‘기초’가 흔들리고 있다는 느낌이 들더라고요.

 

그래서 한 걸음 물러나, 다시 처음으로 돌아가 보려고 합니다.
익숙하다고 생각했던 기본 개념들부터 차근차근 다시 공부해보려 합니다.

 

Object Pool 이란?

일반적으로 게임에서 오브젝트를 생성할 때는
Instantiate()를 사용하고, 제거할 때는 Destroy()를 사용합니다.

하지만 Object Pool은 이 방식 대신,

  • 미리 일정 개수의 오브젝트를 생성해두고
  • 필요할 때 꺼내서 사용하고
  • 사용이 끝나면 삭제하지 않고 다시 비활성화해서 보관

하는 구조입니다.

 

즉, "만들었다 부수는 게 아니라, 계속 재사용한다" 가 핵심입니다.

 

왜 사용하는가?

1. 성능 최적화

Instantiate()와 Destroy()는 생각보다 비용이 큰 작업입니다.

  • 메모리 할당/해제 발생
  • CPU 연산 증가
  • 프레임 드랍 유발 가능

특히 아래 상황에서 치명적입니다:

  • 총알 (FPS 게임)
  • 이펙트 (폭발, 파티클)

Object Pool을 사용하면
이런 비용을 줄여서 프레임 유지가 훨씬 안정적입니다.

 

2. 가비지 컬렉션(GC) 부담 감소

오브젝트를 계속 생성/삭제하면
메모리 쓰레기가 쌓이면서 GC(가비지 컬렉션)가 발생합니다.

 

GC가 발생하면:

  • 순간적으로 프레임이 끊김 (렉 발생)

Object Pool은 오브젝트를 재사용하기 때문에
GC 발생 빈도를 크게 줄일 수 있습니다.

 

3. 안정적인 게임 흐름 유지

오브젝트 생성 타이밍이 몰리면
갑자기 프레임이 떨어지는 “스파이크” 현상이 생깁니다.

Object Pool은 미리 만들어두기 때문에
게임 도중 성능 변화가 적고 더 부드럽습니다

 

실제 사용 예시

예시를 위해 간단한 스트립트를 만들어 보았습니다.

public class ObjectPoolLegacy : MonoBehaviour
{
    public GameObject prefab;
    private Queue<GameObject> pool = new Queue<GameObject>();
    public int poolSize = 10;

    // 시작할 때 poolSize 만큼 미리 오브젝트 생성 (Prewarm)
    void Start()
    {
        for (int i = 0; i < poolSize; i++)
        {
            GameObject obj = Instantiate(prefab);
            obj.SetActive(false);
            pool.Enqueue(obj); //poolSize 만큼 Enqueue
        }
    }

    //오브젝트 생성 함수
    public GameObject GetObject()
    {
        //풀에 오브젝트가 있는경우
        if(pool.Count > 0)
        {
            //오브젝트 활성화, pool - 1
            GameObject obj = pool.Dequeue();
            obj.SetActive(true);
            return obj;
        }
        else
        {
            //아닌경우 오브젝트 생성
            return Instantiate(prefab);
        }
    }

    //오브젝트 리턴 함수
    public void ReturnObject(GameObject obj)
    {
        if (pool.Count < poolSize)
        {
            //오브젝트 활성화, pool + 1
            obj.SetActive(false);
            pool.Enqueue(obj);
        }
        else
        {
            Destroy(obj);
        }
    }
}

 

사용영상:

https://youtu.be/wP7bbBSoVVA

 

오브젝트 생성 키를 아무리 빨리 눌러봐도 30개 내외로 유지되는 것을 볼 수 있습니다

 

오늘의 기록은 여기까지 주인장은 이만 로그아웃합니다. 모두 평안한 밤 보내세요!