2024. 1. 31. 21:00ㆍ내일배움캠프
1월 31일
오늘은 메모리 사용량 관리 기법 그중에서 오브젝트 생성과 파괴를 관리하는 기법인
'오브젝트 풀링' 에 대해서 정리해 보도록 하자.
메모리 사용량 관리는 게임 성능 최적화의 중요한 측면이다.
메모리를 과도하게 사용하면 게임이 충돌하거나 느려져 플레이어의 경험이 저하될 수 있기 때문에
메모리를 효율적으로 관리하는 방법을 이해하는 것이 중요하다.
오브젝트 풀링 왜 알야아할까?
유니티에서 오브젝트를 생성하고 삭제하는 과정은 상당히 비용이 많이 발생하게 된다.
Intantiate(오브젝트 생성) 에서 메모리를 새로 할당하고 리소스를 로드하는 등의 초기화 과정
Destroy(오브젝트 파괴) 파괴 하고 난 이후 발생하는 가비지 컬렉팅으로 인한 프레임 드랍이 발생할 수 있다.
우리가 FPS 게임을 한다고 가정해보자 우리는 총을 쏘는데 총을 쏘기 위해선 총알이 필요할 것이다.
이때 우리가 총을 쏠때마다 총알을 생성, 삭제를 반복하게 되면 어떤 일이 일어날까?
수 많은 오브젝트들에 메모리를 할당하고 해제하는일이 반복되면서 상당히 큰 부담이 될것이다.
이럴때 사용하는 것이 바로 오브젝트 풀링이다.
오브젝트 풀링이란 쉽게 설명하면
미리 내가 필요한걸 많이 만들어두고? 필요할때마다 만들어둔 것에서 꺼내서 쓰고
쓴 다음에는? 다시 넣어두는 오브젝트를 활성화 비활성화 하는 방식으로 게임을 최적화 하는 방법이다.
그림으로 한번 보자
설명한대로 미리 총알을 많이 생성해두고 필요할때마다 총알을 보관함에서 꺼내 쓰고
총알을 사용하고 나면 다시 총알 보관함에 보관하는 방식이다
그렇다면 이 오브젝트 풀링 어떻게 구현할까?
구현방법
간단하게 총알을 오브젝트 풀링 방식으로 구현하는 방법에 대해서 알아보도록 하자
일단 총알 프리팹과 총알 보관함을 만들어준다.
총알 프리팹은 왜? 라고 묻는다면 미리 생성해둔 총알보다 더 많은 총알을 써서
총알 보관함에 총알이 없을 경우도 생각해야한다 그때는 필요한 만큼의 총알을
더 생성해서 총알 보관함에 넣어줘야 한다. 그때 사용할 총알프리펩을 가지고 있어야 한다.
총알 보관함은 Queue로 만들었는데 다른 방식으로도 만들수는 있겠지만 선입선출 자료구조인 Queue가
내가 생각하는 오브젝트 풀링 방식에 가장 적합하다고 생각했기 때문에 Queue로 보관함을 만들어 주었다.
실제로도 많은 사람들이 Queue로 보관함을 만드는것 같다.
그리고 총알을 생성해야하는데 생성하는 함수를 만들어보자.
초기에 총알을 생성해줄때 혹은 생성된 총알이 부족해져서 추가로 더 생성해야할때 사용할 함수다.
왜 바로 SetActive를 false로 해주냐면 생성된 총알은 일단 보관함에 들어가야한다. 그렇기에
SetActive를 생성 직후엔 false로 바꿔서 눈에 안보이는채로 존재하게 만들자
총알을 발사할때 실행될 함수다
조건을 준다 총알 보관함에? 총알이 충분하다면, 총알이 0개가 아니라면
총알 보관함에서 총알을 빼서주고 총알 보관함에 총알이 충분하지 않다면 추가로 생성해서 전해준다.
총알을 발사하고나서 목표물에 명중했거나 총알이 너무 멀리 날아가서 자연적으로 소멸된 상태라면
돌려받을 함수도 만들어 줘야한다.
총알을 받아서 다시 보관함에 넣어주는 함수다
오브젝트 풀링은 기본적으로 이런식으로 구현하면 되겠다.
오늘은 게임을 최적화 하는 방법중에 하나인 오브젝트 풀링에 대해서 알아보았다.
메모리 사용을 최적화하는 것은 게임 개발에 굉장히 중요한 측면인것 같다.
게임을 플레이하면서 주기적으로 생성,삭제가 반복되는 오브젝트들에게는
오브젝트 풀링 기법을 잘 적용시켜보자.
1월 31일 TIL은 여기서 마치도록 하겠다.
'내일배움캠프' 카테고리의 다른 글
240202-TIL (0) | 2024.02.02 |
---|---|
240201-TIL (0) | 2024.02.01 |
240130-TIL (0) | 2024.01.30 |
240129-TIL (0) | 2024.01.29 |
240126-TIL (0) | 2024.01.26 |