풀매니저란 무엇일까🤔
📌 오브젝트 풀(Object Pool) : 객체를 미리 생성해 두고 필요하면 가져다 쓰고, 다 쓰면 풀에 반납하는 형식 ( 웅덩이에 객체를 넣어두고 필요할 때 꺼내쓴다는 느낌)
<br><br>
- 풀은 보통 리스트, 스택, 큐 등으로 구현.
- Stack<T>이 그나마 낫다고 함. <br><br>
- 장점
- 생성과 소멸이라는 큰 비용의 작업을 최소화
- 메모리 할당과 해제의 반복을 막아줌.
- 가비지 컬렉션에 따른 성능 저하도 막아줌
- 빈번하게 생성하고 파괴되는 객체에서 애용😺 (ex. 총알, 이펙트) <br><br>
- 단점
- 자칫 잘못하면 메모리 사용량 늘림
- 오브젝트 풀의 크기를 적당히 조절해야해...
- +자주 사용하지 않는 오브젝트는 판단해서 가끔씩 제거하도록 <br><br>
- 자칫 잘못하면 메모리 사용량 늘림
⚙풀매니저의 선언과 사용🔨
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class ObjectPool : MonoBehaviour
{
[System.Serializable]
public struct Pool
{
public string tag;
public GameObject prefab;
public int size;
}
public List<Pool> pools;
public Dictionary<string, Queue<GameObject>> poolDictionary;
private void Awake()
{
poolDictionary = new Dictionary<string, Queue<GameObject>>();
foreach (var pool in pools)
{
Queue<GameObject> objectPool = new Queue<GameObject> ();
for (int i = 0; i < pool.size; i++)
{
GameObject obj = Instantiate(pool.prefab);
obj.SetActive(false);
objectPool.Enqueue (obj);
}
poolDictionary.Add (pool.tag, objectPool);
}
}
public GameObject SpawnFromPool(string tag)
{
if (!poolDictionary.ContainsKey(tag))
return null;
GameObject obj = poolDictionary[tag].Dequeue();
poolDictionary[tag].Enqueue(obj);
return obj;
}
}
🌊사용하기까지의 흐름🌊
🔍더 알아보기🔍
🏊♀️다중 풀링이란🏊♂️
📌_다중 풀링이란..._ 서로 다른 게임 오브젝트들을 각각 풀링하는 것으로, 각각의 풀을 하나의 컨테이너에서 관리하는 것을 의미한다.
- 접근 할 때마다 선형탐색, 이진 탐색을 이용하는 것은 비효율적.
- 해시 테이블 형태의 컨테이너를 사용하라.
- C# 에서는 Dictionary<KeyType, Stack< GameObject >>
- 풀에 접근할 Key를 미리 정의할 것.
<br><br>
💾샘플 오브젝트
📌_샘플 오브젝트란..._ 복제의 대상이 될 샘플 오브젝트를 하나 구비하여 파괴되지 않도록 보장하는 것.
<br><br>
🤔Key를 어떻게 정하고 어떤 타입으로 정할까?
- 가장 쉬운 방법 : 게임오브젝트의 이름이나 태그
- 그러나 .name, .tag 프로퍼티로 참고할 때 마다 스트링이 동적 생성되어 가비지를 남김.
- 따라서 풀매니저의 장점이 무뎌짐. <br><br>
해결법
- 컴포넌트 추가 사용
- 복제된 오브젝트 모두 캐싱하기
📎Reference📎
'골드메탈'님 유튜브'호리의 개발공부'님 Tistroy 블로그'rito15'님 github.io 블로그
Uploaded by N2T