BLOG main image
Category (342)
MySpace (89)
Astronomy (50)
Development (178)
Drum (25)
linux에서 subversion설정
누리에 없을 자그마한 자국
살라딘의 생각
saladin's me2DAY
3D Avata - BuddyPoke
기찬 개발이야기
[FLEX] ANT로 ASDOC 사용하기
THLIFE.net
Flash10 대응 Textcube 1.7.5.1..
텍스트큐브 공지사항
«   2008년 11월   »
            1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30            
325636 Visitors up to today!
Today 136 hit, Yesterday 963 hit
/Development/Flex/AIR 관련글 보기 2008년 04월 22일 13시 37분

참고사항 : 이 글을 쓸 때 Essential ActionScript 3.0 책을 참고해서 쓴글입니다. 이 책에는 제가 쓴글대로 나와있는데... 실제로는 정확하지 않나봐요. 불꽃남자님께서 지적하셨는데.. 실제로 테스트해보면 바로 GC대상이 안된다고 하네요. 정말 안습인데... 이 점에 대해서 다시 한번 테스트해봐야겠습니다. .

이 글을 읽으시고 꼭 Flash Player 의 가비지 컬렉션(GC) 동작 방식에 대해를 참고해주세요.




ActionScript 3.0 기반으로 Flex, AIR, Flash등으로 코딩을 할 때, 빼놓지 않는 것이 바로 이벤트 처리이다. 이벤트에 대해서 알아야 할 것은 수십가지 되지만 그 중에서 이벤트를 사용시 쓸데없는 메모리 낭비를 방지하기 위해 프로그래머가 반드시 알아야하는 사항을 적어보았다.

ActionScript 3.0의 이벤트는 전체 4부분으로 구성된다.

1. 이벤트 발생자(event dispatcher)
말그대로 어떠한 시점에 특정 이벤트를 발생시켜주는 함수이다.

2. 이벤트 청취자(event listener)
함수(메소드)로 구성되며 인자로 이벤트의 참조를 받는다.

3. 이벤트 청취 등록자(event listener register)
Flash Player의 내부적으로 구성된 어떠한 이벤트 청취자 목록에 정의한 이벤트 청취자 함수의 참조를 등록해준다.

4. 이벤트 청취 삭제자(event listener remover)
이벤트 청취자 목록에 등록된 이벤트를 목록에서 삭제해준다.

아래 코드를 보자.
이벤트 발생자는 URLLoader안에 정의되어 있어서 이 코드에는 보이지 않는다.
URLLoader는 Text나 Binary와 같은 non-visual 요소를 가지는 데이타를 받아오는데 쓰이는데, 이때 해당 데이타 로드를 완료하면 "complete" 이벤트를 발생한다. 이때 urlLoader에 completeListener를 청취 목록(a listener list)에 등록했기 때문에 "complete" 이벤트 발생후 자동적으로 completeListener()메소드를 호출하게 된다.

package {

       import flash.display.Sprite;

       import flash.events.*;

       import flash.net.*;

 

       public class FileLoader extends Sprite

       {

             public function FileLoader()

             {

                    var urlLoader:URLLoader = new URLLoader();

                   

                    //completeListener() 이벤트 청취 등록자

                    urlLoader.addEventListener(Event.COMPLETE, completeListener);

                    urlLoader.load(new URLRequest("someFile.txt"));

             }

            

             //이벤트 청취자

             private function completeListener(e:Event):void

             {

                    trace("Load Complete");

             }

       }

}


이와 같은 동작방식에 대해서는 대부분 이해할 것이라 생각한다. 그러나 여기서는 중요하게 알아보고자 하는 것은 이런식으로 이벤트 청취자를 청취자 목록에 등록하게 되면 Flash Player가 종료되지 않는 이상 이 이벤트 청취자는 메모리와 CPU를 점유하게 된다. 그러므로 이벤트 Listener이 더 이상 필요하지 않다면 이벤트 삭제자를 이용해 청취자 목록에서 삭제하는 것이 현명하겠다. 아래코드 처럼~

private function completeListener(e:Event):void

{

       trace("Load Complete");

       e.target.removeEventListener(Event.COMPLETE, completeListener);

}




잠깐 다음의 경우를 보자.


package {

       import flash.display.Sprite;

       import flash.events.*;

       import flash.net.*;

 

       public class AnnoymousListener extends Sprite

       {

             public function EventMemory()

             {

                    stage.addEventListener(

                           MouseEvent.MOUSE_MOVE,

                           function (e:MouseEvent):void

                           {

                                 trace("mouse move");      

                           });

             }

       }

}


위의 코드에는 익명 청취자(AnonymousListner)를 등록했다. 이 경우에는 이벤트 청취 삭제자(event listener remover)를 사용해서 삭제할 수 없다. 이때는 등록된 청취자 함수가 stage의 청쥐자 리스트에 프로그램 끝날때까지 영원히 등록되게 된다. 프로그램 끝날때까지 청취자 함수가 지워질 필요가 없을때는 이렇게 해도 되지만 사용하지 않을 상황인데 사용한다면 그것은 분명 메모리 낭비가 될 것이다.

지금부터 이벤트 청취자를 사용할 때 잠재적인 메모리 낭비가 어디서 오는지 하나의 예를 들어보도록 하겠다.

나비잡기게임(a butterfly-catching game)을 연상해보자.
여러마리의 나비가 나오고 그 나비를 마우스 포인터로 가 올라갔을 때 클릭하면 잡잡는 것으로 하자.
프로그램의 메인 클래스는 ButterflyGame으로 하고 각 나비는 Butterfly 클래스의 인스턴스가 되겠다. TimerEvent.TIMER 이벤트가 25ms마다 메인 클래스에서 발생하고 생성된 Butterfly class에서 정의한 이벤트 청취자를 통해 Timer 이벤트를 청취하도록 만든다. 그리하여 25ms 마다 Butterfly 객체의 위치를 이동하게 만든다.

아래는 Butterfly class 코드이다.

package

{

       import flash.display.Sprite;

       import flash.events.TimerEvent;

       import flash.utils.Timer;

 

       public class Butterfly extends Sprite

       {

             // Butterfly 객체는 중앙 timer 참조값을 받아 이벤트 청취 함수를 등록한다.

             //, 하나의 이벤트 발생자에 여러개의 청취 함수가 등록되는 것이다.

             public function Butterfly(gameTimer:Timer)

             {

                    gameTimer.addEventListener(TimerEvent.TIMER, timerListener);

             }

            

             private function timerListener(e:TimerEvent):void

             {

                    trace("Calculating new butterfly position...");

             }

       }

}


다음은 ButterflyGame 클래스이다. 아주 단순하게 되어 있다.

package

{

       import flash.display.Sprite;

       import flash.utils.Timer;

 

       public class ButterflyGame extends Sprite

       {

             private var timer:Timer;

             private var butterfly:Butterfly;

            

             public function ButterflyGame()

             {

                    //Game 타이머              

                    timer = new Timer( 25, 0 );

                    timer.start();

                    addButterfly();

             }

            

             //butterfly 게임에 추가한다.

             public function addButterfly():void

             {

                    butterfly = new Butterfly(timer);

             }