개요
객체 풀은 반복적으로 생성 및 제거되는 오브젝트를 매번 새로 만드는 것이 아닌 일정량을 미리 생성해두고 사용 중인지 아닌지 구분하여 생성시 사용중이 아닌 오브젝트를 사용하고 제거시 해당 오브젝트를 비사용으로 돌려 사용하는 패턴이다. 메모리 할당 및 해제의 오버헤드와 메모리 단편화를 막을 수 있어 메모리 성능을 향상시킬 수 있는 패턴이다. 특히 모바일같이 메모리 관리자나 GC, 관련 하드웨어들이 약한 환경에서는 메모리 단편화가 치명적이기에 더욱 유용하다.
객체 풀을 구현하는 간단한 방법은 객체 풀 클래스에서 객체들의 배열을 관리하고 각 객체에서 자신의 사용 여부를 관리한다. 객체 생성시 사용중이지 않은 객체를 사용중으로 바꾸고 초기화한 뒤 리턴하거나 자신이 관리한다. 객체 풀은 생성한 오브젝트를 리턴하여 사용자에게 넘길 수도 있지만 그러지 않고 생성 요청만 받은뒤 자신이 관리하며 사용하는 경우도 있다. 대표적인 예시가 파티클이다. 해제 요청받은 객체는 사용하지않는 상태로 바꾼다.
풀과 포함될 객체를 설계할 때는 둘을 커플링 시켜 컴팩트한 구조로 만들지 디커플링하여 일반화된 방식으로 만들지 고려해볼 수 있다.
빈칸 리스트
객체 풀에서 사용중이지 않은 객체를 찾을때 배열을 순회하는 방식도 있지만 효율적이지 않다. 이럴때 주로 사용되는 방법이 빈칸 리스트이다. 빈칸 리스트는 배열안의 사용되고 있지 않은 객체들이 next포인트를 이용하여 다른 사용하고 있지 않은 객체들을 링크드 리스트로 가르키는 방식을 의미한다. 우선 객체 풀에서 사용하지않는 헤드 객체 포인터를 하나 둔다. 맨 처음에는 모든 객체가 사용중이 아니기에 첫번째 객체를 헤드에 두고 각 개체는 자신의 다음 객체를 가르키도록한다. 마지막 객체는 null을 가르킨다. 객체 사용 요청시에 헤드의 객체를 사용하고 헤드가 가르키던 다음 객체를 헤드로 둔다. 객체 반납시에는 기존 헤드를 반납된 객체가 가르키고 반납된 객체를 헤드에 넣는다. 이런식으로 구현하면 맨 마지막 비사용 객체가 사용될시 헤드에 null이 들어간다. 이 경우 남은 빈 객체가 없는 것이므로 적절한 처리를 하도록 하면된다. 여기에는 assert, 생성 안함, 풀 크기 늘리기 등이 있다.
이렇게 하면 초기화 시 O(n), 생성 및 삭제 시 상수 급의 성능으로 객체 풀을 운용할 수 있다.
참고서적
게임 프로그래밍 패턴
'디자인 패턴 > 게임 프로그래밍 패턴' 카테고리의 다른 글
[게임 프로그래밍 패턴][20]공간 분할 (0) | 2024.05.12 |
---|---|
[게임 프로그래밍 패턴][18]더티 플래그 (0) | 2024.05.10 |
[게임 프로그래밍 패턴][17]데이터 지역성 (0) | 2024.05.06 |
[게임 프로그래밍 패턴][16]서비스 중개자 (0) | 2024.05.05 |
[게임 프로그래밍 패턴][15]이벤트 큐 (0) | 2024.05.05 |