이 함수는 충돌체가 트리거 존에 들어올 때 호출됩니다. 충돌체가 "Map" 태그와 MapBehaviour 컴포넌트를 갖고 있으면 해당 풀 인덱스를 ReplaceMap()에 전달하고, 그렇지 않으면 오브젝트를 제거합니다.
private void ReplaceMap(int oldIdx){ int randListIdx = GetRandomFreeIdx(); int newIdx = m_FreeIndices[randListIdx]; m_FreeIndices[randListIdx] = oldIdx; m_NextSpawnPoint = m_MapPool[oldIdx].transform.position + new Vector3(0.0f, 0.0f, m_GroundLength * m_SpawnAmount); m_MapPool[newIdx].transform.position = m_NextSpawnPoint; m_MapPool[newIdx].SetActive(true); m_MapPool[oldIdx].SetActive(false);}
이 함수는 사용 가능한 인덱스를 선택해 풀에서 새 맵을 재배치하고 활성화하며, 기존 맵을 비활성하고 해당 인덱스를 나중에 재사용할 수 있도록 풀에 되돌려 넣습니다. 이를 통해 잦은 인스턴스화를 피하면서 풀에 재사용 가능한 맵을 유지합니다.
2. 프로젝트: Spaceship Battle
Spaceship Battle는 예전에 만든 프로젝트로, 오브젝트 풀링 설명하기 위해 사용했습니다.
저장소 보기
SpaceShip Battle의 BulletManager 클래스는 큐 기반 풀 구조를 사용해 오브젝트 풀링으로 총알을 재사용합니다. 이는 위의 프로젝트 Infinite Runners와 달리 무작위 선택이 필요하지 않기 때문입니다.
풀 미적용 vs. 풀 적용 - 성능 비교
위 이미지에서 볼 수 있듯이, FPS 차이는 왼쪽의 풀 미적용 상태가 성능이 훨신 낮고, 오른쪽의 풀 적용 상태가 훨씬 더 높은 성능을 보여줍니다.
맺는 말
오브젝트 풀링은 강력한 기법으로, 런타임에 자주 생성되고 소멸되는 오브젝트를 효율적으로 관리합니다. 그러나 너무 많은 오브젝트를 사전에 생성하면 상당한 메모리 낭비로 이어질 수 있습니다. 따라서 런타임 중에 필요한 오브젝트 수를 신중히 예측하고, 그에 맞춰 적절한 풀 크기를 설정하여 과한 메모리 할당을 방지하는 것이 중요합니다. 마지막으로, 제 두 프로젝트의 오브젝트 풀링 적용 사례에서 볼 수 있듯이, 상황에 따라 풀에 맞는 적합한 자료 구조를 선택하는 것도 매우 중요합니다.