오브젝트 풀링이란 어느 장소(Pool)에 미리 생성한 오브젝트를 필요할 때 갖다 쓰고 다시 넣어놓는 방법이다.
왜 이런 방식을 사용할까? 그냥 생성하고 삭제만 잘 해주면 장땡 아닌가?
오브젝트를 생성할 땐 새로 메모리를 새로 잡아주고 리소스를 끌어오거나 사용자가 붙여준 스크립트 등 여러 행동이 동반된다.
오브젝트를 소멸시킬 때에도 C#에서는 기본적으로 가비지 컬렉팅을 해주기 때문에 소멸 횟수가 많아질수록 CPU는 하는 일이 많아진다.
공부한 소스코드의 내용을 정리해본다.
public class PoolManager : MonoBehaviour
{
public GameObject[] prefabs;
List<GameObject>[] pools;
private void Awake()
{
pools = new List<GameObject>[prefabs.Length];
for(int i=0; i<pools.Length; ++i)
{
pools[i] = new List<GameObject>();
}
}
public GameObject Get(int index)
{
GameObject select = null;
foreach(GameObject item in pools[index])
{
if(!item.activeSelf)
{
Debug.Log("찾았다.");
select = item;
select.SetActive(true);
break;
}
}
if(!select)
{
Debug.Log("못찾았다.");
select = Instantiate(prefabs[index], transform);
pools[index].Add(select);
}
return select;
}
}
pools는 리스트의 배열이다. pools[index]는 오브젝트들이 들어있는 리스트를 가리킨다.
foreach문에서 item은 pools[index]라는 하나의 리스트(리스트배열X)를 순회할 때의 오브젝트이다.
오브젝트의 활성화 여부를 체크하고 비활성화 된 것을 활성화시키고 리턴한다.
if문에서는 풀에 비활성 객체가 없는 것이다
prefabs[index]를 생성하고 pools[index]에 Add 해준다.
그리고 생성한 객체의 참조를 반환해준다.
어제부터 시작한 병합, 자잘한 버그의 수정을 거쳐서 모든 과정을 끝냈다.
협업의 첫 발을 디뎌보자는 방향에 잘 맞게 마무리가 된 것 같다.
팀장직, 발표 등을 먼저 나서서 맡아주신 팀장님과 맡은 부분 이상으로 열심히 해주신 팀원 분들 덕에 배운 것도 많았고, 앞으로 어떤 태도로 임해야할지 생각해볼 수 있었다.