개인적으로 프로젝트를 진행하면서 새롭게 알게된 내용을 정리하려고 한다.

일단은 프로젝트 탭에서 작성하긴 하는데.. 어디에 들어갈지 애매하긴하다. 

언젠가 쓸 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

+ Recent posts