Unreal: 오브젝트 풀링(Object Pooling)
게임에서 새로이 객체를 월드에 스폰하는건 생각보다 부하가 심한 일일 수 있다. 간단한 상황에선 문제가 없을 수 있겠지만, 수많은 객체가 움직여야하는 MMO, 많은 탄환이나 아이템이 존재하는 FPS등 복잡한 상황에서는 매번 총알이나 아이템을 스폰수 삭제를 반복하는 과정은 성능에서의 부담을 가진다.
- 메모리에 할당과 해제를 하는 과정 자체가 단순 일부 변경보단 연산에 시간을 많이 소모할 수 있다.
- 메모리 파편화/단편화(Memory Fragmentation)가 일어난다. 이는 하나의 큰 연속된 메모리 공간을 남기지 못함으로서 메모리 사용의 효율성을 저하시킨다.
이를 해결할 똑똑한 방법이 있다면 스폰과 삭제를 하지 않는것이다. 즉 소환은 해놓고, 삭제 대신 비활성화만 시키면서 재활용한다면, 훨씬 효율적으로 작동하지 않겠는가? 이를 오브젝트 풀링(Object Pooling)이라고 부른다.
- 미리 총알, 아이템등 필요한 객체를 스폰한 후 보이지 않고 상호작용하지 않도록 모든 기능을 꺼놓는다.
- 필요할 때, 새로 스폰 대신 이전에 소환해 둔 객체를 활성화해 적절하게 사용한다.
- 사용이 끝나면 다시 비활성화 해놓고 다음에 사용하도록 정리해둔다.
구현방식 자체는 여러가지가 있겠다. 하나의 매니저가 모든 풀 안에 모든 오브젝트를 추적관리하는 방식, 오브젝트 안에 활성화/비활성화 기능을 자율적으로 만드는 방법, 혹은 해당 기능을 컴포넌트처럼 탈착 가능하게 해놓는 방법등 세부적인 구현은 상황에 따라 나뉘겠지만 생성과 삭제 대신 생성과 재활용으로 대신한다는 개념은 핵심적으로 동일하다.
This post is licensed under CC BY 4.0 by the author.
