개인적으로 프로젝트를 진행하면서 새롭게 알게된 내용을 정리하려고 한다.
일단은 프로젝트 탭에서 작성하긴 하는데.. 어디에 들어갈지 애매하긴하다.
언젠가 쓸 operator new, operator delete에 대한 내용은 어느 탭에 들어가야 하지..
뭐 아무튼 그때가서 생각하기로 하겠다.
MemoryPooling
게임상에서는 많은 오브젝트들이 생성 혹은 삭제된다.
많은 몬스터가 나오는 게임에서
몬스터가 만들어질때 new, 죽을때 delete를 하게되면 게임성능 및 속도에 많은 영향을 미치게된다.
특히 탄막슈팅 게임의 경우, 각 총알마다 생성, 삭제를 하게된다면 끔찍한 결과를 보게될 것이다.
이런경우 MemoryPooling 개념을 도입하면 성능 향상에 큰 도움이 될 것이다.
개념은 간단하다.
1. 게임을 시작하면 메모리 컨테이너에 필요한 만큼의 메모리를 미리 할당 해 놓는다. 초기의 모든 메모리는 Free상태이다.
2. 게임 플레이 중 오브젝트를 생성할 상황이 오면 메모리를 새로 할당하는 것이 아니라
미리 생성해 놓은 메모리 중 Free메모리를 이용하여 오브젝트를 초기화한다.
4. 사용중인 메모리는 non_Free상태가 된다.
3. 사용 후 오브젝트를 삭제할 때 메모리를 해제하는 것이 아니라 Free메모리로 전환 시킨다.
즉, 게임 플레이중 메모리를 동적할당 하지 않는것이 핵심이다.
좀더 쉽게 그림으로 표현하면 아래와 같다.
장점
1. 위에서 언급했던 것처럼 플레이 중 생성과 삭제의 오버헤드에서 자유로울 수 있다.
2. 메모리 단편화를 막을 수 있다. (메모리 단편화에 대한 포스트는 따로 진행하겠다.)
단점
단순히 new와 delete를 했던 구조보다는 조금 복잡해질 수 있다.
(물론 ObjectPooling사용자입장에서는 느끼지 못하도록 캡슐화를 해야한다.)
결과
MemoryPooling을 이용하여 구현한 탄막과 그렇지 않은 탄막의 성능 및 속도 차이
동영상
1. MemoryPooling사용안함
https://drive.google.com/file/d/0Bzy8i8T-Oo5kSTB3TDFhZU5rT3c/view?usp=sharing
2. MemoryPooling사용
https://drive.google.com/file/d/0Bzy8i8T-Oo5kcktSMjdockNISkk/view?usp=sharing
두 영상은 가운데 존재하는 원과 충돌하면 없어지는 탄막들이다.
영상을 찍기 시작한 처음부분과 끝나는 부분을 제외하더라도
MemoryPooing개념을 도입한 이후 눈에 띄게 부드러워진 것을 확인 할 수 있었다.
코드에 관한 내용은 [MemoryPooling_2] 포스트에서 계속 이어나가겠다.
'All > Project' 카테고리의 다른 글
ObjectManager (0) | 2016.04.12 |
---|---|
PoolingManager (0) | 2016.04.12 |
게임 전체 클래스 UML 및 간단설명 (0) | 2016.04.12 |
게임 개요 (0) | 2016.04.11 |
MemoryPooling_2 (0) | 2016.03.15 |