C#

오브젝트 풀링(Object Pool)

s0002 2023. 2. 5. 22:43

오브젝트 풀링은 프로젝트 최적화 기법 중 하나이다

개념을 간단히 말하자면 게임에 필요한 오브젝트들을 오브젝트 풀에 미리 생성해서

필요할 때마다 꺼내서 쓰고 사용이 끝나면 풀에 돌려주는 것이다

 

아래는 오브젝트 풀링의 과정이다

먼저 오브젝트를 담을 풀을 만든다

그리고 풀에 오브젝트들을 생성해서 오브젝트 풀에서 오브젝트들을 관리하게 만든다

외부에서 오브젝트를 필요로 하면 오브젝트 풀에서 꺼내간다

꺼내갈 때 풀 안의 모든 오브젝트들이 사용 중이라면 새로운 오브젝트를 생성해서 꺼내준다

꺼내간 오브젝트의 사용이 끝나면 풀에 돌려준다

 

오브젝트 풀링을 이용하면 

필요할 때마다 오브젝트를 생성하고 사용이 끝나면 삭제하는 방식을 이용할 때보다

CPU의 부담이 적어진다


아래는 오브젝트 풀링을 적용한 코드이다

오브젝트 10개를 미리 생성한 다음 오브젝트 풀링 큐에 비활성화 상태로 저장하고

1초마다 한 개씩 꺼내서 활성화 상태로 변경해서 사용한다

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

public class Game : MonoBehaviour
{
    public GameObject enemyPrefab;
    public Queue objectPoolingQ = new Queue();

    void Start()
    {
        for (int i = 0; i < 10; i++)
        {
            GameObject enemyGo= Instantiate(enemyPrefab);
            enemyGo.SetActive(false);
            objectPoolingQ.Enqueue(enemyGo);
        }

        StartCoroutine(ActivateEnemy());
    }
    
    IEnumerator ActivateEnemy()
    {
        while (true)
        {
            GameObject go = (GameObject)objectPoolingQ.Dequeue();

            float posx = Random.Range(-2.2f, 2.2f);
            float posy = Random.Range(6.1f, 6.5f);
            go.transform.position = new Vector3(posx, posy, 0);

            go.SetActive(true);

            yield return new WaitForSeconds(1f);
        }
    }
}

 

아래는 위에서 사용한 오브젝트가 특정 위치에 도달하면 다시 비활성화 상태가 되고

오브젝트 풀링 큐에 돌아가는 코드이다

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

public class Enemy : MonoBehaviour
{
    public float speed = 2;
    private Queue objectPoolingQ;

    void Start()
    {
        this.objectPoolingQ = GameObject.Find("Game").GetComponent<Game>().objectPoolingQ;
    }

    void Update()
    {
        this.transform.Translate(Vector3.down * this.speed * Time.deltaTime);

        if (this.transform.position.y < -5.6f)
        {
            this.gameObject.SetActive(false);
            this.objectPoolingQ.Enqueue(this.gameObject);           
        }
    }
}

 

 

 

참고

https://wergia.tistory.com/203

 

[Unity3D] Programming - 오브젝트 풀링 기법 구현하기

Programming - 오브젝트 풀링 기법 작성 기준 버전 :: 2019.2 프로그래밍에서 오브젝트를 생성하거나 파괴하는 작업은 꽤나 무거운 작업으로 분류된다. 오브젝트 생성은 메모리를 새로 할당하고 리소

wergia.tistory.com