안녕하세요 주인장입니다.
요즘 들어 문득 스스로를 돌아보게 되는 순간이 많아졌습니다. 무언가를 계속 쌓아가고 있다고 생각했는데, 정작 가장 중요한 ‘기초’가 흔들리고 있다는 느낌이 들더라고요.
그래서 한 걸음 물러나, 다시 처음으로 돌아가 보려고 합니다.
익숙하다고 생각했던 기본 개념들부터 차근차근 다시 공부해보려 합니다.
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);
}
}
}
사용영상:
오브젝트 생성 키를 아무리 빨리 눌러봐도 30개 내외로 유지되는 것을 볼 수 있습니다
오늘의 기록은 여기까지 주인장은 이만 로그아웃합니다. 모두 평안한 밤 보내세요!
'개발 > Unity' 카테고리의 다른 글
| [Unity] SOLID 원칙 (5) DIP : 의존성 역전 원칙 (0) | 2025.12.02 |
|---|---|
| [Unity] SOLID 원칙 (4) ISP : 인터페이스 분리 원칙 (0) | 2025.11.28 |
| [Unity] SOLID 원칙 (3) LSP : 리스코프 치환 원칙 (0) | 2025.11.26 |
| [Unity] SOLID 원칙 (2) OCP : 개방 폐쇄 원칙 (0) | 2025.11.25 |
| [Unity] SOLID 원칙 (1) SRP : 단일 책임 원칙 (0) | 2025.11.24 |