티스토리 뷰

 

 

 

오브젝트 풀링의 사용 이유 : 오브젝트의 생성과 파괴는 부하가 크고, 오브젝트의 파괴는 GC(Garbage Collector : 가비지 컬렉터)를 발생시켜 성능을 저하시킨다. 따라서 게임을 할 때 생성, 파괴가 반복되는 오브젝트들 때문에 일어나는 GC를 방지하기 위해서 오브젝트 풀링을 사용한다.

 

오브젝트 풀링의 개념 : 풀링을 할 오브젝트 풀 구현 → 풀에 오브젝트 일정 개수를 만들어서 넣어 논다. → 풀에서 오브젝트를 꺼내서 사용 → 사용이 끝나면 다시 풀에 넣는다. → 필요할 때 다시 꺼내서 재사용(모든 오브젝트가 사용 중이라면 새로 생성해서 사용)

 

 

 

Object Pooling의 개념

 

 

 

유니티 엔진에서의 구현 : 

 

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

public class ObjectPoolManager : MonoBehaviour
{
    private static ObjectPoolManager instance;
    public static ObjectPoolManager Instance
    {
        get
        {
            return instance;
        }
    }

    public ObjectPool pool;

    private void Awake()
    {
        if (instance)
        {
            Destroy(gameObject);
            return;
        }
        instance = this;
    }
}

 

Object Pool을 관리하는 Object Pool Manager

 

Object Pool Manager는 하나만 존재해야 하기 때문에 싱글톤 패턴을 사용

 

 

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

public class ObjectPool : MonoBehaviour
{
    [SerializeField]
    private Poolable poolObj;
    [SerializeField]
    private int allocateCount;

    private Stack<Poolable> poolStack = new Stack<Poolable>();

    void Start()
    {
        Allocate();
    }

    public void Allocate()
    {
        for(int i = 0; i < allocateCount; i++)
        {
            Poolable allocateObj = Instantiate(poolObj, this.gameObject.transform);
            allocateObj.Create(this);
            poolStack.Push(allocateObj);
        }
    }

    public GameObject Pop()
    {
        Poolable obj = poolStack.Pop();
        obj.gameObject.SetActive(true);
        return obj.gameObject;
    }

    public void Push(Poolable obj)
    {
        obj.gameObject.SetActive(false);
        poolStack.Push(obj);
    }
}

 

오브젝트 풀링을 구현한 클래스이다.

 

Allocate 함수는 풀링 할 오브젝트를 미리 정한 개수만큼 생성해주고 스택에 할당해준다.

 

Pop 함수와 Push 함수는 이름 그대로 오브젝트를 풀에서 꺼내고, 넣어주는 기능이다.

 

풀에 넣어져있을는 사용하지 않는 상태이니 비활성화한다.

 

반대로 풀에서 꺼내서 사용할 때는 활성화해준다.

 

 

public class Poolable : MonoBehaviour
{
    protected ObjectPool pool;

    public virtual void Create(ObjectPool pool)
    {
        this.pool = pool;
        gameObject.SetActive(false);
    }

    public virtual void Push()
    {
        pool.Push(this);
    }
}

 

풀링을 할 오브젝트가 상속받는 클래스

 

처음 생성될 때는 풀 안에 있는 상태니까 비활성화해준다.

 

 

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

public class Arrow : Poolable
{
    float power = 1000f;
    Rigidbody2D rb2d;
    Vector3 dir;

    private void Awake()
    {
        rb2d = GetComponent<Rigidbody2D>();
        dir = transform.right;
    }

    private void OnEnable()
    {
        rb2d.AddForce(dir * power);
    }

    private void OnBecameInvisible()
    {
        Push();
    }
}

 

풀링을 할 오브젝트인 Arrow에 추가하는 컴포넌트

 

오브젝트가 사용되는 순간 오른쪽으로 날리고 사용이 끝나면 다시 풀에 넣어주는 역할

 

카메라에서 렌더러가 표시되지 않으면 사용이 끝났다고 판단해 다시 풀에 넣어준다.

 

 

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

public class Bow : MonoBehaviour
{
    public GameObject shootPos;

    void Update()
    {
        if (Input.GetMouseButtonDown(0))
        {
            ObjectPoolManager.Instance.pool.Pop().transform.position = shootPos.transform.position;
        }
    }
}

 

Bow 오브젝트에 추가하는 컴포넌트

 

마우스 좌클릭 시 풀에서 오브젝트를 꺼내 주는 역할

 

 

 

아래는 유니티에서 플레이했을 때의 모습이다.

 

 

 

 

 

 

댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/07   »
1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31
글 보관함