[디자인 패턴] - 오브젝트 풀링 (Object Pooling) 패턴
오브젝트 풀링 (Object Pooling) 이란?
오브젝트 풀링(Object Pooling)은 비싼(성능 비용이 큰) 오브젝트의 생성 및 파괴를 최소화하고, 재사용할 수 있도록 미리 생성해두고 관리하는 디자인 패턴이다.
게임에서는 수많은 오브젝트들을 사용하고, 이러한 오브젝트들을 실시간으로 생성하고, 파괴하는 과정을 반복하다보면 메모리 할당과 해제하는 일이 반복이 된다. 할당과 해제는 CPU가 담당하고, CPU에 부담이 오브젝트가 많아질수록 더해지게 된다.
이러한 과정에서 많은 성능을 필요로하며 그에 따라 프레임이 끊길 수도 있다. 이 과정에서 가비지 컬렉터가 발생하고 많은 오브젝트들이 생성과 반복이 되면 수많은 가비지 컬렉터가 발생하여 CPU에 더 큰 부담이 된다.
그걸 방지하기 위해, 메모리를 사용하여 해결하는 방법이 바로 오브젝트 풀링 패턴이다.
- 오브젝트를 미리 생성해두고 재사용하여 퍼포먼스를 최적화하는 패턴
- Instantiate()와 Destroy()를 반복하는 것은 성능 저하의 원인이 됨
사용 예시 : 총알 발사 시스템, 적 스폰, 파티클 효과, 아이템 드롭
✅ 장점
✅ (1) 성능 향상
- Instantiate()와 Destroy()는 메모리 할당 및 해제 비용이 높음
- C#에서는 **GC(Garbage Collector)**가 동작하면서 성능 저하 발생 가능
→ 오브젝트를 미리 생성해두고 비활성화하는 방식으로 GC 호출을 줄일 수 있음
✅ (2) FPS(프레임율) 안정화
- Instantiate()와 Destroy()를 남발하면 프레임 드랍이 발생할 수 있음
- 오브젝트 풀링을 사용하면 프레임 유지가 쉬워지고, 부드러운 게임 플레이 가능
✅ (3) 메모리 효율 증가
- 반복적으로 생성되는 오브젝트를 미리 만들어두고 재사용하기 때문에 불필요한 메모리 낭비 방지
✅ (4) 예측 가능한 오브젝트 수량 관리
- 미리 풀(Pool)에 저장해둔 개수를 기준으로 관리 가능
- 오브젝트가 과도하게 생성되는 문제를 방지
- 풀에서 가져온 오브젝트가 이전 사용 상태를 유지하고 있을 수 있음 (초기화되지 않은 채 등장)
✅ 해결 방법:
- 객체 상태 초기화 함수 구현: 오브젝트를 재사용하기 전에 초기 상태로 되돌리는 함수 추가
❌ 2. 유지보수 및 코드 복잡도 증가
- 여러 개의 오브젝트 풀을 관리해야 할 경우 코드가 더욱 어려워질 수 있음
✅ 해결 방법:
- 싱글톤 패턴 적용: PoolManager 같은 전역 관리 클래스를 만들어 코드 구조를 정리
❌ 3. 초기 메모리 사용량 증가
- 게임이 시작될 때 미리 오브젝트를 일정 개수만큼 생성해야 하므로 초기 메모리 사용량이 많아질 수 있음
- 필요 이상으로 많은 오브젝트를 생성하면 불필요한 메모리 낭비가 발생
✅ 해결 방법:
- 게임 초기에 최소한의 오브젝트만 생성하고, 필요할 때 추가 생성
- 적절한 풀 크기 제한을 설정하여 과도한 메모리 사용 방지
생성과 삭제를 사용하는 경우

오브젝트 풀링

총알 생성 오브젝트 풀링 구현
PoolManager.cs 생성 및 수정
딕셔너리(Dictionary)를 사용하는 이유 ? - 여러 개의 오브젝트 풀을 태그별로 관리하기 위해 사용,
- 키(Key) - string tag : 오브젝트 풀의 태그 (예: "Enemy", "Bullet", "Item")
- 값(Value) - Queue<GameObject> : 해당 태그에 속하는 오브젝트들을 담아두는 큐
큐(Queue)를 사용하는 이유 ? - Queue는 먼저 들어간 오브젝트가 먼저 나오는 구조 (선입선출)이기 때문에
풀에서는 먼저 사용된 오브젝트가 가장 먼저 다시 사용되도록 하는 것이 효율적이다.
총알, 총 스크립트 생성 및 수정
Invoke - 특정 메서드를 일정 시간이 지난 후 자동으로 실행하는 Unity의 내장 함수
nameof() - 연산자는 메서드 이름을 문자열로 변환하는 기능
Invoke("ReturnToPool", lifetime); // 문자열을 직접 입력 (오타 발생 가능)
Invoke(nameof(ReturnToPool), lifetime); // nameof() 사용 (오타 방지)
결과