본문 바로가기
C#/C# 학습 (TIL)

C# 오브젝트 풀링

by jjiing 2022. 6. 26.

이전 팀프로젝트 때 정리해둔 내용이다.

(제가 직접 한땀한땀 만든 피피티..)

게임 내에서 총알같은 오브젝트를 계속해서 생성하고 파괴하면 C#같은 경우는 가비지 콜렉터를 불러서 이를 처리하는데, 

그 때마다 성능이 저하된다.

이를 방지하기 위해 오브젝트 풀에 미리 오브젝트를 일정량 생성해놓고

이를 꺼내와서 쓰고 다시 풀에 넣어두는 방식으로 구현하는 식의 최적화 기법이다.

일정량 이상의 오브젝트가 필요하면 그때그때 더 만들어 쓸 수 있다.

 

오브젝트 풀링을 구현하는 방법은 여러가지가 있는데 나는 큐 자료구조를 활용했다.

 

 

실제 프로젝트 때 작성한 코드이다.

오브젝트 풀링 스크립트

1번. 2번에서 생성된 오브젝트를 큐에 enqueue하고 비활성화 해두기

2번. 매개변수 count만큼 오브젝트를 생성

3번. 다른 스크립트에서 오브젝트를 꺼내 쓰는 함수. 활성화 시켜준다.

큐 안에있는 오브젝트가 부족하면 2번을 호출해 추가로 오브젝트를 생성해준다.

4. 다 쓴 오브젝트를 비활성화 해 큐에 다시 넣어주기

 

 

다른 스크립트에서 오브젝트 풀링을 쓰는 부분

 

 

 

 

 

아래 코드는 추가로 오브젝트를 학습하며 정리해둔 코드이다.

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

public class objectPool : MonoBehaviour
{
    //1. 미리 오브젝트들을 많이 생성해두고 콜렉션(리스트, 스택, 큐, etc) dpo 담아둔다.
    //2. 미리 만들어둔 오브젝트들을 전부 비활성화 시킨다.
    //3. 사용할 때는 활성화시킴
    //4. 다쓰면 다시 비활성화

    public GameObject bulletPrefab;
    Queue<GameObject> bulletPool = new Queue<GameObject>();
    void Start()
    {
        CreateBullet(10);
    }


    
    void CreateBullet(int num=1)    //변수 설정 안해주면 디폴트값 1로
    {
        for(int i = 0; i < num; i++)
        {

            //이것 주의!!!! 프리팹을 가져다 쓰면 안됨. 복제 된 걸 새로운 인스턴스에 담을 것
            GameObject bullet=Instantiate(bulletPrefab, transform);
            //transfom하면 현재 오브젝트의 자식 오브젝트로 복제(생성)
            bullet.SetActive(false);
            bulletPool.Enqueue(bullet);
            
        }
    }
    public GameObject UseBullet()
    {
        if (bulletPool.Count > 0)
        {
            GameObject bullet = bulletPool.Dequeue();
            bullet.SetActive(true);
            return bullet;
        }
        else 
        {
            CreateBullet(5); //디폴트값1, 그냥 넉넉하게 해주는게 좋음
            GameObject bullet = bulletPool.Dequeue();
            bullet.SetActive(true);
            return bullet;
            
        }
    }
    public void GetBackBullet(GameObject bullet)
    {
        bullet.SetActive(false);
        bulletPool.Enqueue(bullet);
    }
}