기획자 본인만큼 잡다한 블로그

greentec.egloos.com

포토로그


통계 위젯 (블랙)

21
17
106708

flag counter

Flag Counter


AS 3.0 - 이벤트 캡쳐를 이용한 eventListener 적게 쓰기 프로그래밍

툴을 개발하다가 겪은 최적화 사례 한 가지를 공유하려고 한다. 요즘 육각형 셀을 쓸 일이 많아서 HexCell이라는 클래스를 만들어 사용해 왔다. 예를 들면 이런 식이다.


public class HexCell extends Sprite
{
public var _x:int;
public var _y:int;
public var _z:int;
public var edgeLength:int = 20;

public function HexCell(_x:int, _y:int, _z:int, edge:int=20)
{
this._x = _x;
this._y = _y;
this._z = _z;
this.edgeLength = edge;



이 HexCell은 실제로 그림판 같은 툴에서 사용자가 마우스로 누를 때 이벤트를 받고, 또 정보를 알려주는 용도로 마우스 오버 / 마우스 아웃 이벤트도 받아야 하므로 처음에는 각 HexCell 당 3개의 이벤트 리스너가 필요했다.


hexCell.addEventListener(MouseEvent.CLICK, onHexCellClick);
hexCell.addEventListener(MouseEvent.MOUSE_OVER, onHexCellMouseOver);
hexCell.addEventListener(MouseEvent.MOUSE_OUT, onHexCellMouseOut);



처음에 작업하는 HexCell의 양이 적을 때는 별 문제가 없었지만, 점점 게임 보드가 커지면서 문제가 생겼다. 각 HexCell이 이벤트 리스너 세 개씩을 들고 있으니, 엄청나게 느려진 것이다. 예를 들어 radius = 6인 정육각형의 보드에는 127개의 HexCell이 존재하고 각 헥스 셀이 들고 있는 이벤트 리스너의 총 합은 127 X 3 = 381 개이지만, radius 증가에 따라 합은 기하급수적으로 늘어난다(사실 등차수열의 합이다).



보통 radius가 24일 때 작업을 하니 이벤트 리스너는 1801 X 3 = 5403개. 이것들이 가져온 속도의 저하는 큰 문제가 되었다. 해결책을 찾던 중 예전에 살펴봤던 이벤트 캡쳐에 관한 레퍼런스가 생각났다.

간단히 살펴보면 어떤 객체(주로 Sprite)가 부모-자식 관계일 때, 이벤트 리스너를 공유하는 것이다. 이렇게 되면 자식들에 이벤트 리스너를 일일이 달아줄 필요 없이, 부모에게만 달아주면 된다.


이 방법으로 5403개의 이벤트 리스너를 3개로 줄였고, 프로그램 속도는 몹시 빨라졌다. 


참고 링크
-------
- AS3 event handling 매커니즘. 한글로 되어 있고 이해하기 쉽게 설명되어 있다.

- 어도비 공식 가이드

덧글

  • 기획자 2014/10/01 21:25 # 답글

    syntax highlighter는 바꿔야겠다. actionscript 2.0 기준으로 syntax highlighting을 하는 듯... _x와 _y는 2.0에서 쓰던 객체의 기본 좌표인데-_-
댓글 입력 영역

애드센스