공부일지

풀 매니저 본문

코딩/디자인패턴

풀 매니저

이하택 2023. 10. 19. 02:45

풀매니저란 무엇일까🤔

📌 오브젝트 풀(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>

해결법

  1. 컴포넌트 추가 사용
  1. 복제된 오브젝트 모두 캐싱하기


📎Reference📎

스파르타 내일배움캠프-Unity

'골드메탈'님 유튜브'호리의 개발공부'님 Tistroy 블로그'rito15'님 github.io 블로그


Uploaded by N2T

'코딩 > 디자인패턴' 카테고리의 다른 글

옵저버 패턴[작성중]  (0) 2023.10.30
전략패턴  (1) 2023.09.25