본문 바로가기
Unity/TIL

오브젝트 풀링과 FixedDeltaTime vs DeltaTime

by 김차루 2024. 5. 9.
 
스파르타 내배캠 18일차 TIL
C5조_🥱안하조(사실 해)

 

 

 

서론 생략. 아래는 강의를 들으면서 정리하면 좋을 내용을 정리해 봤다.

 

 

오브젝트 풀링

간단하게 말하면 오브젝트의 pool(수영장 같이 모일 수 있는 공간)을 만들어 두고, 연속적으로 필요한 총알이나 화살, 이펙터 같은 것을 넣어두고 필요할 때마다 꺼내서 사용하는 것을 의미한다. 

 

게임에는 많은 오브젝트가 사용되는데 필요할 때마다 만들고(Instantiate()) 없애면(Destroy()) 메모리를 할당하고 해제하는 일이 반복된다. 또한 메모리를 해제할 때 유니티에서 가비지 컬렉터가 발생하게 되는데 이렇게 되면 CPU에 부담이 많이 가지고 게임이 무겁게 돌아가게 된다.

 

그래서 아예 오브젝트를 넣어둘 수 있는 곳을 만들고 거기서 꺼내쓰고 넣고, 재활용하기 위해 오브젝트 풀링을 사용한다. 

PoolDictionary = new Dictionary<string, Queue<GameObject>>();

foreach (var pool in pools)
{
    Queue<GameObject> queue = new Queue<GameObject>();
    for(int i = 0; i < pool.size; i++)
    {
        GameObject obj = Instantiate(pool.prefab, transform);
        obj.SetActive(false);
        queue.Enqueue(obj);
    }

    PoolDictionary.Add(pool.tag, queue);
}

 

위의 코드는 투사체의 오브젝트 풀링의 초기 코드이다. FIFO를 하기위해 큐를 만들고 지정한 사이즈만큼 미리 투사체를 만들어 둔다. 그리고 만들어진 투사체들을 재활용하는 형식으로 사용하게 된다.  

 

 

Deltatime  vs  FixedDeltaTime

 

DeltaTime

이전 프레임의 발생 시각과 현재 프레임의 발생 시각 사이의 시간 간격, 즉 이전 프레임의 수행에 걸린 시간을 의미

 

FixedDeltaTime

물리 업데이트 발생 주기, 즉 Fixed Time Step 값을 의미

 

이 둘의 차이점을 알기 위해서는 일단 Update 함수에 대해 알아야 한다. Update 함수는 프로그램에서 정해진 시간 간격으로 호출되는데 이 정해진 시간이 fps이다. fps의 경우 컴퓨터 사양에 따라 달라지기 때문에 우리는 프레임 시간 동기화를 해줘야 한다. 그 방법이 위에 두 가지의 함수를 포함한 Time.함수이다. 

 

그래서 두 함수의 차이는 무엇인가. 의미에서도 보이다 싶히 '물리'라는 단어에 차이점이 있다. 

DeltaTime은 프레임 간의 시간 간격을 나타낸다. 그래서 일반적으로 이동, 회전, 시간에 따른 변화 계산 등과 같이 매 프레임마다 업데이트가 필요한 로직에 사용된다.

void Update() {
    float speed = 5.0f;  // 초당 5미터
    transform.Translate(Vector3.forward * speed * Time.deltaTime);
}

 

FixedDeltaTime은 물리 업데이트 간격을 나타낸다. 이 시간 간격은 일반적으로 일정하며, 기본적으로 0.02초로 성정되어 있다. 물리계산에 있어서 정확도와 안정성을 보장 받을 수 있다. 

void FixedUpdate() {
    float forceMagnitude = 10.0f;  // 힘의 크기
    rigidbody.AddForce(Vector3.up * forceMagnitude);
}

 

요약하자면, 프레임 단 시간 계산이 필요할 때 물리 쪽에서 필요하다면 FixedDeltaTime을 사용, 기본적인 시간 연산을 하게 될 경우 DeltaTime을 사용!

 

 

 

마무리하며

유니티 게임 개발 입문 강의를 다 듣고 개인 과제를 하며 복습을 시작했다. 5시부터 갠플을 시작한 것 같은데 진척이 없어서 늘어지는 것 같다. 새로운 에셋을 이용해서 해보고자 했지만, 그 에셋은 플레이어의 파츠가 다 나눠져 있어 모든 스프라이트를 알맞게 flip해야 하는 상황이 발생했다. 그리고 기존 에셋에서도 보우가 아닌 칼을 착용하게 되면 칼 자체가 기본 rotation 값이 있어서 이것을 어떻게 뒤집을지도 고민이었다. 저녁 시간과 TIL을 작성하는 시간이 껴서 고민을 중단하게 됐는데 조금만 더 고민해 보고 튜터님께 위의 두 고민을 하고 가야 할 것 같다. 내 선에서 해결하면 더 좋고!

'Unity > TIL' 카테고리의 다른 글

개인과제 마무리  (0) 2024.05.13
ReadyOnly + 갠플 개발 일지  (0) 2024.05.10
Unity 게임 개발 입문 시작  (0) 2024.05.08
2주차 팀플 마무리  (0) 2024.05.07
TextRPG 팀플 마무리  (0) 2024.05.03