프로그래밍

오브젝트 풀링

하바사 2023. 1. 29. 02:04

오브젝트 풀링이란 오브젝트의 풀(Pool 웅덩이)을 만들어둬서 오브젝트가 필요할 때마다 그 안에서 꺼내 쓰고 다시 넣는 걸 의미한다. 필요한 오브젝트가 있을 때마다 새로 만들고, 필요없어지면 파괴하면 어떻게 될까? 오브젝트를 생성하고 파괴하는 동작은 CPU에 과부하를 준다. 유니티의 경우엔 오브젝트 파괴->메모리를 해제하면 가비지 컬렉터가 동작하는데 가비지 컬렉터 자체가 CPU에 많은 부담을 준다.

그렇다면 우리는 굳이 오브젝트가 필요하고/필요없어질 때마다 실시간으로 생성/파괴를 할 필요가 없다. 위에서 언급한 대로 미리 만들어두고, 필요할 때 활성화시키고 필요없어질 때 비활성화시키면 된다. 생성, 파괴 동작이 빈번하게 일어나지 않는다. 이것이 바로 오브젝트 풀링이다.

<형태1>

using UnityEngine;
using System.Collections.Generic;
using UnityEngine.Events;

public class ObjectPool : MonoBehaviour
{
    private static ObjectPool _instance;

    private Stack<T> objectStack = new Stack<T>();

    void Awake()
    {
       _instance = this;
    }

    public T Get()
    {
        T element;
        if (m_Stack.Count == 0)
        {
            element = new T();
            countAll++;
        }
        else
        {
            element = objectStack.Pop();
        }

        return element;
    }

    public void Release(T element)
    {
        if (objectStack.Count > 0 && ReferenceEquals(objectStack.Peek(), element))
            Debug.LogError("이미 오브젝트 풀에 들어있어요.");
        
        objectStack.Push(element);
    }

}