출처 : https://medium.com/@sawomirkowalski/design-patterns-object-pool-e8269fd45e10
게임에 필요한 오브젝트를 미리 생성해서 필요할 때마다 꺼내쓰고 사용이 끝나면 오브젝트 풀에 돌려주는 것
게임에 필요한 오브젝트를 미리 생성해놓고, 모자라면 추가로 생성하여 쓰고 게임이 끝나면 파괴하는 방식
재사용이 빈번한 총알, 이펙트 등을 object pool을 만들어 한번 쓰고 파괴하는 방식이 아니라 사용하고 나면 active false 해주었다가 다시 사용할 때 active true 해주어 재사용 하는 방식
메모리를 신경 쓰지 않고 객체를 생성/파괴 할 수 있음
Object pool을 사용하지 않고 그냥 객체를 생성/파괴하면 Garbage Collector를 불러 성능을 저하시킨다. GC가 많이 불리는 것을 방지하고자 Object Pool을 사용하는 것.
-오브젝트 풀 클래스는 싱글톤이기 때문에 오브젝트 풀은 데이터베이스 연결이나 스레드 연결에서 특히 유용하다.즉, 여러 스레드에서 순식간에 액세스하지 않도록 보호된다.
쓰레기 수집(garbage collection, 가비지 컬렉션, GC)은 메모리 관리 기법 중의 하나로, 프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능이다.
자바, C#, 그리고 일부 스크립트 언어들은 처음부터 쓰레기 수집 기법을 염두에 두고 설계되어, 언어 정의에 쓰레기 수집이 포함되어 있다. C, C++ 등의 프로그래밍 언어는 수동 메모리 관리를 가정하고 설계되었으나, 쓰레기 수집을 지원하는 구현도 존재한다.
유효하지 않은 포인터 접근: 이미 해제된 메모리에 접근하는 버그를 가리킨다. 만약 이 포인터가 해제되고 새로운 값이 할당되었다면, 잘못된 값을 읽어오게 된다.
이중 해제: 이미 해제된 메모리를 또다시 해제하는 버그를 가리킨다. 일부 메모리 할당 알고리즘에서는, 해제된 메모리를 다시 해제하려고 시도하는 것은 오류를 일으킬 수 있다.
메모리 누수: 더이상 필요하지 않은 메모리가 해제되지 않고 남아있는 버그를 가리킨다. 메모리 누수가 반복되면 메모리 고갈로 프로그램이 중단될 수 있다. (접근 가능한 메모리가 증가하여 메모리가 고갈되는 문제는 쓰레기 수집으로도 막을 수 없다)
어떤 메모리를 해제할지 결정하는 데 비용이 든다. 객체가 필요없어지는 시점을 프로그래머가 미리 알고 있는 경우에도 쓰레기 수집 알고리즘이 메모리 해제 시점을 추적해야 하므로, 이 작업은 오버헤드가 된다.
쓰레기 수집이 일어나는 타이밍이나 점유 시간을 미리 예측하기 어렵다. 때문에 프로그램이 예측 불가능하게 일시적으로 정지할 수 있다. 이런 특성은 특히 실시간 시스템에는 적합하지 않다.
할당된 메모리가 해제되는 시점을 알 수 없다. 자원 할당과 변수 초기화를 일치하는 RAII(Resource Acquisition is Initialization) 스타일의 프로그래밍에서는, 이것은 자원 해제 시점을 알 수 없다는 것을 의미한다.