CS

오브젝트 풀링(Object Pooling)이란

llIlIIllII 2023. 11. 22. 09:22

오브젝트 풀링(Object Pooling)은 특히 게임 개발에서 자주 사용되는 기법으로, 유니티(Unity)에서도 매우 중요한 역할을 한다.
이 기법의 핵심은 게임 오브젝트를 필요할 때마다 생성하고 파괴하는 대신 미리 생성해두고 필요할 때 재사용하는 것이다.

  • 성능 최적화
    오브젝트를 생성하고 파괴하는 과정은 리소스를 많이 소모한다. 특히, 자주 생성 및 파괴되는 오브젝트가 많은 게임에서 이러한 과정은 성능 저하를 일으킬 수 있습니다. 오브젝트 풀링은 이러한 성능 저하를 방지하기 위해 사용된다.
  • 재사용 메커니즘
    필요할 때 오브젝트를 풀(pool)에서 꺼내 사용하고, 사용이 끝나면 다시 풀로 반환하는 방식이다. 이렇게 함으로써, 오브젝트의 생성과 파괴에 드는 비용을 줄일 수 있다.

 

유니티에서의 오브젝트 풀링 구현 방법

오브젝트 풀 생성

오브젝트 풀을 관리할 클래스를 생성한다.
이 클래스는 생성할 오브젝트의 타입을 관리하고, 필요한 수만큼 오브젝트 인스턴스를 미리 생성하여 리스트나 큐에 저장한다.

오브젝트 획득 및 반환 메커니즘 구현

오브젝트를 요청할 때, 풀에서 오브젝트를 꺼내 사용하고, 사용이 끝나면 오브젝트를 다시 풀에 반환하는 메서드를 구현한다.
오브젝트를 꺼낼 때는 활성화 (SetActive(true))하고, 반환할 때는 비활성화 (SetActive(false))한다.

 

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

public class PoolManager : MonoBehaviour
{
    public GameObject[] prefabs; // 오브젝트풀링을 사용할 프리펩
    List<GameObject>[] pools
    public static PoolManager I;

    private void Awake()
    {
        if (I == null)
        {
            I = this;
        }
        else if (I != this)
        {
            Destroy(gameObject);
        }

        DontDestroyOnLoad(gameObject);


        pools = new List<GameObject>[prefabs.Length];

        for (int index = 0; index < pools.Length; index++)
        {
            pools[index] = new List<GameObject>();
        }
    }

    public GameObject Get(int index)
    {
        GameObject select = null;

        foreach (GameObject item in pools[index])
        {
            if (!item.activeSelf)
            {
                select = item;
                select.SetActive(true);
                break;
            }
        }
        if (!select)
        {
            select = Instantiate(prefabs[index], transform);
            pools[index].Add(select);
        }

        return select;
    }
}