scaleform.minarto.com

Object Pooling in as2 본문

Utils & Liblary

Object Pooling in as2

미나토 2012. 2. 21. 17:59


전에 올렸던 포스팅 중에 외부 라이브러리에 관한 글이 있었습니다.
거기서 테스트 했던 라이브러리 중 polygonal labs 에서 만든 ObjectPool 이 있었습니다.


객체 풀링에 관한 글은 다음의 글들을 한번씩 보시기 바랍니다

http://help.adobe.com/ko_KR/as3/mobile/WS948100b6829bd5a6-19cd3c2412513c24bce-8000.html 
http://www.diebuster.com/flash/6 
http://blog.jidolstar.com/666 


단점이 아예 없는 것은 아니지만 메모리 풀링은 거의 무조건 쓰는게 좋습니다. 저도 as3 작업을 할 때는 위에서 언급한 ObjectPool 을 씁니다. (직접 만들긴 귀찮잖아요)


자, 그런데 스케일폼은 아직 많은 곳에서 as2로도 작업을 해야합니다. 하지만 as3 에서는 많이 쓰지만 as2에서는 잘 쓰질 않더군요...

그럼 as2용 ObjectPool 클래스를 만들어 볼까요?


allocate 함수부터 만들어보겠습니다. allocate  함수는 ObjectPool 클래스를 초기화하고 풀을 생성하는 역할을 합니다.

_dic = [];

function allocate($size:Number, $constructor:Function):Void {
for (i= 0; i < $size; i++ ) {
_dic.push(new $constructor);
}
}



as3에서는 두번째 인자로 class 형을 받지만 as2에서는 class 형이 없습니다...

하지만 클래스를 만들었다면 그 안에 생성자 함수가 있기 마련입니다. 클래스로 인한 객체 생성이란 것이 결국 new 연산자 다음에 생성자 함수를 실행하는 겁니다.

그러니 class 는 없지만 위와 같이 만들면 됩니다.

그럼 이번엔 객체를 가져오는 get 함수입니다.

function get object() {
return _dic.pop();
}


간단하죠???

다 쓴 객체를 반환하는 return 함수가 있어야겠죠?

function return object($obj):Void {
_dic.push($obj);
}



이렇게 간단할 수가!!!! 다 만들었습니다.

물론 제대로 만들려면 손볼 곳이 꽤 많지만, 지금으로도 훌륭한 풀링 클래스가 만들어졌습니다.


제가 MovieclipLoader 클래스를 십만개 만들어 돌려본 결과,
풀링을 사용한 쪽이 750 ms, new 로 생성한 쪽이 1150 ms 가 나오네요...


너무 간단한 코드기 때문에 더이상 뭐 딱히 설명할 것도 없네요. :^) 요점은 이겁니다.

as2 로도 메모리 풀링을 사용할 수 있다!!! 
 
우리 모두 new 연산자 없는 코딩을 해보아요~~~


p.s.

리터럴로 생성할 수 있는 객체는 리터럴로 생성하는 것이 대부분 빠릅니다.
물론 메모리 관리의 잇점 때문에도 풀링을 쓰지만, 속도가 느리다면 그 의미가 많이 퇴색되겠죠?

예를 들어 Array, Object 같은 경우는 리터럴로 생성하는게 빠릅니다.