1인 개발/숫자의 신

숫자의 신 개인 프로젝트 4일차

잼잼재미 2024. 7. 25. 15:33

구현 내용


1. 오브젝트풀 구현


 

디펜스 게임 특성 상, Block의 생성 파괴가 계속 반복된다. 프리팹의 Instantiate, Destroy 함수는 비용이 크기 때문에 오브젝트를 미리 생성해서 재사용하는 ObjectPool을 사용해서 최적화 했다.

 

 

ObjectPoolController

public GameObject CreateBlock(string poolName, Vector3 startPosition)
{
    GameObject block = ObjectPool.SpawnFromPool(poolName);
    block.transform.position = startPosition;
    block.SetActive(true);
    return block;
}

 

 

ObjectPool

[System.Serializable]
public struct Pool
{
    public string Tag;
    public GameObject Prefab;
    public int Size;
}

public List<Pool> Pools;
public Dictionary<string, Queue<GameObject>> PoolDictionary;

private void Awake()
{
    GameObject objectPoolPrefabs = new GameObject("ObjectPoolPrefabs");
    PoolDictionary = new Dictionary<string, Queue<GameObject>>();
    foreach (var pool in Pools)
    {
        Queue<GameObject> objectPool = new Queue<GameObject>();
        for (int i = 0; i < pool.Size; i++)
        {
            GameObject obj = Instantiate(pool.Prefab, objectPoolPrefabs.transform);
            obj.SetActive(false);
            objectPool.Enqueue(obj);
        }
        PoolDictionary.Add(pool.Tag, objectPool);
    }
}

public GameObject SpawnFromPool(string tag)
{
    if (!PoolDictionary.ContainsKey(tag))
        return null;

    GameObject obj = PoolDictionary[tag].Dequeue();
    PoolDictionary[tag].Enqueue(obj);

    return obj;
}

 

GameObject를 미리 생성해서 오브젝트 활성화, 비활성화를 통해 재활용하도록 했다. Queue 자료구조의 선입선출 방식을 통해, 먼저 생성된 GameObject가 먼저 활성화 되도록 했다. 

 

 

https://kkln2486.tistory.com/167

 

Object Pool

Object Pool 오브젝트를 미리 생성하고 삭제하지 않고, 재사용 해서 최적화하는 방법 프리팹의 Instantiate, Destroy 함수는 비용이 큼 총알과 같이 자주 생성되고 삭제되는 프리팹에 사용 총알 Effect Objec

kkln2486.tistory.com

 

이전 프로젝트에서 Object Pool 구현을 참고했다.

 

 

트러블 슈팅


1. 오브젝트풀을 사용한 최적화


Instiate 사용
ObjectPool 사용

 

  • CPU : 6 -> 4.8 
  • FPS : 180 -> 210 

 

프리팹의 Instiate, Destroy를 ObjectPool을 통해 최적화 하였다.

 

 

회고


오늘은 Block의 아이템 구현 전, Block의 ObjectPool을 구현했다. 자주 생성, 파괴되는 프리팹은 최적화를 위해 ObjectPool을 사용해서 재활용하는 것이 좋기 때문이다. Block을 더 추가 구현하기 전, 오브젝트 풀은 미리 구현해 놓는게 좋다고 생각했다. 이전 프로젝트에서 ObjectPool을 구현한 적이 있어서 참고하여 쉽게 구현할 수 있었다. 다음은 Block의 아이템 구현을 해보도록 하겠다.