게임에서 오브젝트간의 통신 방법은 보통 폴링, 콜백, 이벤트를 자주 사용한다.

 

 

1. 폴링

어떤 버튼이 눌러졌는지 폴링으로 조사할 때는 아래와 같은 방법을 사용한다.

 

bool g_ButtonState[ BUTTON_QUANTITY ];

 

void func(){

    if( g_ButtonState[ BUTTON_A ] ){

        //

    }

}

 

폴링은 결합도는 높지만 간단하게 구현할 수 있어서 콜백이나 이벤트보다 효율적이다. 단점으로는 Update 함수가 커질 수 있다는 점이다.

 

 

 

2. 콜백

 

콜백은 어떤 이벤트가 발생했을 때 호출하고 싶은 함수를 등록해 놓으면 이후 그 이벤트가 발생했을 때 등록한 함수가 호출된다.

 

typedef void (*CallBackFunc)();

typedef std::list<CallBackFunc> CallBackFuncs;

CallBackFuncs g_CallBackTable[ EVENT_QUANTITY ];

 

void register(){

    // 함수 등록

}

 

void dispatch(){

    if( g_ButtonState[ BUTTON_A ] ){

        for(

        CallBackFuncs::iterator it=g_CallBackTable[ BUTTON_A ].begin(),end=g_CallBackTable[ BUTTON_A ].end();

        it != end;

        ++it)

        {

            (*it)();

        }

    }

}

 

다른 방법으로는 발생한 이벤트를 큐잉하여 스케줄링 하면서 실행하는 방법도 있다.

콜백의 실행에 가상함수를 사용할 때는 함수를 호출할 때 인스턴스가 살아 있어야 한다. 스마트 포인터나 핸들 등의 시스템을 사용하면 좋다.

 

 

 

3. 이벤트

 

콜백과 비슷하지만 차이는 함수에 넘겨주는 인수이다. 이벤트는 관련된 이벤트 ID와 그것과 관련된 데이터를 인수로 넘긴다.

 

typedef void (*CallBackFunc)(char *, int);

typedef std::list<CallBackFunc> CallBackFuncs;

CallBackFuncs g_CallBackTable[ EVENT_QUANTITY ];

 

// 호출될 콜백 함수

void func(char *data, int quantity){

    assert(data);

    for( int i = 0; i < quantity; ++i ){

        Object *o = GetObject(data);

        o->SetDead(true);

        NextObject(data);

    }

}

 

특정 이벤트만 예를 들면 사운드 재생이 끝나던가 지면과 충돌했을 때를 조사하고 싶다면 콜백을 사용한 쪽이 좋다. 이벤트는 이 프레임에서 충돌한 모든 오브젝트를 조사하고 싶다 라는 경우에 사용하면 좋다.

 

 

 

1차 출처 : http://altdevblogaday.com/2011/02/11/managing-coupling-part-2-%E2%80%94-polling-callbacks-and-events/

2차 출처 : http://blog.gameenginejp.com/2011/02/blog-post_13.html

 

저작자 표시
신고
by 흥배 2012.02.01 09:30
| 1 |

티스토리 툴바