
기본적으로 유니티에선 Instantiate() 메서드를 이용해 오브젝트를 생성하거나, Destory()메서드를 이용해 오브젝트를 파괴할 수 있다.
그러나 이러한 생성과 파괴는, 리소스를 꽤 많이 소모하는 작업이며, 파괴된 오브젝트가 메모리 할당에서 사라지더라도, 카비지 컬렉터 작업이 빈번해져 성능저하를 유발할 수 있다.
해당 오브젝트가 한 두개만 사용된다면 큰 문제가 없을 수도 있지만, 문제는, 수십, 수백개의 다량의 오브젝트가 필요한 경우이다.
슈팅게임에서의 총알이나, 디펜스 게임의 몬스터들이 예시가 될 수 있을 것이다.
그 점을 해결할 수 있는 것이 오브젝트 풀링(Object Pooling)이다.
오브젝트 풀링은 기본적으로 오브젝트를 오브젝트 풀에 미리 생성해 두고, 필요할 때 활성화하고, 필요하지 않으면 비활성화하여 관리하는 최적화 기법 중 하나이다.
다음은 오브젝트 풀의 간단한 예시이다.
public class ObjectPool : MonoBehaviour
{
public GameObject prefab;
private List<GameObject> pool = new List<GameObject>();
public int poolSize = 300;
void Awake()
{
for (int i = 0; i < poolSize; i++)
{
GameObject obj = Instantiate(prefab, transform);
pool.Add(obj);
obj.SetActive(false);
}
}
public GameObject Get()
{
GameObject obj = null;
for (int i = 0; i < poolSize; i++)
{
if(!pool[i].activeSelf)
{
pool[i].SetActive(true);
obj = pool[i];
}
}
return obj;
}
}
Awake에서 어떤 특정 prefab을 생성하고 리스트에 넣으며 비활성화 한다.
사용할 일이 있으면, 비활성화되어있는 오브젝트를 하나 활성화하는 식의 구현이다.
본 코드는 더이상 활성화 시킬 리스트가 없다면 생성을 하지는 않는다.
'내일배움캠프 TIL' 카테고리의 다른 글
| 내일배움캠프 29일차 TIL "Raycast" (0) | 2024.10.24 |
|---|---|
| 내일배움캠프 28일차 TIL "코루틴(Coroutine)" (0) | 2024.10.23 |
| 내일배움캠프 26일차 TIL "UI에서의 Anchor" (0) | 2024.10.21 |
| 내일배움캠프 25일차 TIL "레이어를 통한 충돌 처리" (0) | 2024.10.18 |
| 내일배움캠프 24일차 TIL "화면 내 좌표 구하기" (0) | 2024.10.17 |