Memory Pooling in as3

플래시에 내장되어 있는 ByteArray의 경우 일종의 Stream메모리 구조를 대체하는 것으로 볼 수 있습니다. 스크립트 언어들은 C처럼 생성한 메모리를 직접 삭제하지 않고 가비지컬렉터가 처리하기 때문에 다들 메모리 관리를 느슨하게 하시는 경향이 있는데, 본질적으로 생성한 메모리를 삭제하는 행위는 상당히 귀찮고 조심스러운 작업이기 때문에 만약 Stream을 통해 메모리를 관리하게 되면 new와 delete의 압박에서 벗어날 수 있게 되어 개발을 효율적으로 할 수 있습니다.
이러한 Stream은 쓰기 읽기 쌍으로 제공되어 new나 delete시에 특정 포인터를 캐쉬해두는 방식을 사용합니다. 하지만 이 Stream이란 방식은 read, write가 잦은 경우 메모리단편화가 심각하게 일어나는 부작용이 있습니다. 이러한 부작용을 막고 언제나 정해진 공간에서 효율적인 메모리를 활용하기 위한 대안이 바로 Pooling 기법입니다.

풀링기법은 이론적으로는 매우 간단합니다.

1. 10개의 공간을 미리 할당해두고
2. 누군가 원하면 비어있는 블럭을 내줍니다.
3. 그리고 그 녀석이 그 공간을 반환하면
4. 다시 빈공간이 되어 남에게 대여할 수 있게 되는거죠.
5. 만약 10개의 공간이 다 대여되었다면 다시 10개의 공간을 또 만들어서 관리합니다.
6. 반환되는 시점에서 새로만든 10개의 블럭이 모두 빈공간이면서 기존의 10개공간에 빈공간이 남아있다면 새로운 공간이 필요없어진 셈이므로 새로 만들었던 공간을 제거합니다.

생각은 간단한데 구현은 어찌할까요? 내부는 일단 잊어버리고 호스트코드를 생각해봅시다. 대부분의 풀링시스템은 오랜 전통과 역사에 맞춰 이름같은게 통일되는 경향이 있습니다.

1. 먼저 풀링객체를 생성해야겠죠.

var pool:Cpool=new Cpool()

2. 다음은 특정 자료형과 몇블럭을 생성할건지 알려줘야합니다. 예를들어 Bitmap 객체를 풀링하겠다면 아래와 같이 됩니다.

pool.allocate(Bitmap, 10);

3. 그 뒤엔 실제로 해당 풀에서 객체를 할당받아서 사용하게 됩니다.

var bit:Bitmap=pool.getInstance(); //new Bitmap() 대신에!

4. 다 쓰면 반환해야겠죠?

pool.remove(bit);

이게 실제 풀링을 쓸 때 보게 될 코드입니다. 실제 이렇게 처리해줄 수 있는 구조와 알고리즘은 검색해보시면 객체풀링 등으로 수도 없이 나오기 때문에 생략하겠습니다. 
com.bsidesoft.ds.Cpool에 넣었습니다.

이러한 객체 풀링을 도입했을때 어떤 잇점이 있을까요.

1. new를 자주하는 어플의 경우 런타임실행에서 상당한 속도이득이 생깁니다. 짜피 풀링은 미리 공간을 할당해두는 작업이므로 전체 실행시간을 갖겠지만, 한번만 할당하면 그 이후엔 그 할당된 공간을 계속 재활용함으로서 많은 이득을 볼 수 있습니다. 일반적으로 객체생성은 복잡한 객체일수록 오래 걸리기 때문에 Sprite같은 하위객체를 잡으시면 거의 80배이상 차이가 납니다.

2. 메모리를 정확하게 통제할 수 있습니다. 알 수 없는 가비지컬렉터에 의존하지 않고 정확히 사용할 메모리만큼만 사용하고 원할때 반환할 수 있으므로 정교한 메모리 통제를 할 수 있습니다.
.
http://lab.polygonal.de/2008/06/18/using-object-pools/

폴리고날 스튜디오에서 자신들이 만든 객체 풀링을 공개하고 있습니다.
이를 살짝 쓰기 편하게 고친게 Cpool입니다 ^^;

P.S 플래시에서 완전한 객체해지능력을 가진 녀석은 누구일까요. 바로 동적 클래스계열의 녀석들입니다. Object, Array, Dictionary 등은 delete나 splite 등으로 어떤 메모리 블럭을 완전히 해지하는데 가비지컬렉터의 도움이 필요없습니다. 하지만 느립니다. 이 녀석들은 잦은 입출력에 쓰기엔 너무 느리다는거죠. 따라서 메모리풀을 저런 컨테이너에 올리고 입출력 자체는 풀이 해주는 방식으로 처리하면 1단계에서 풀에서 제거하고, 2단계에서 풀을 delete로 제거하는 과정을 통해 완전히 메모리에서 제거할 수 있습니다.



관련된 글:

  1. 자동 풀링(auto pooling)을 구현해보자.
  2. 가비지컬렉터 와 메모리 관리
  3. 키코드값표
  4. swf로 ajax를 대신하기
  5. obj파일과 최적화 문제

Leave a Reply