본문 바로가기

프로그래밍/API

EncoreNet이라는 네트워크 프레임워크의 RMI??...

GPGStudy를 통해 최근 배현직(imays)님이 만드신 EncoreNet이라는 네트워크 엔진을 보았습니다.

엔진에 대한 설명을 보면서, 게임에 상당히 최적화 되어 있다는 느낌을 받았습니다.

그 중에 RMI(Remote Method Invocation)라는 기능을 보았습니다. 함수 개발에 있어 상당히 매력적으로
보였습니다.

Remote Method Invocation의 약자입니다. 일반적인 네트워크 프로그래밍에서, 메시지 타입, 메시지 헤더 구조체, 송신 함수, 수신 처리 함수를 개발자가 직접 만드는 것이 일반적인데, RMI를 이용할 경우 메시지에 들어갈 내용물을 함수 선언처럼 작성하기만 하면 메시지 타입부터 송수신 처리 루틴까지 모두 컴파일러에 의해 자동 생성됩니다. 또한 EncoreNet™ RMI는 게임 처리 성능에 최적화되어 있기 때문에 RMI를 쓴다고 개발자가 직접 송수신 루틴을 만드는 것과 성능 차이가 거의 없습니다.

그래서 저도 재미삼아 구현해 보았습니다. 배현직님이 어떻게 만드셨는지는 모르겠지만 나름대로 구현 원리를
찾아 봤습니다.

  "네트워크로 전달받은 데이터를 함수의 인자로 직접 처리될수 있도록 구현한다."

라는 기준으로,

예를 들어  서버에서 클라이언트에 존재하는 ObjectMove()라는 함수를 원격으로 호출한다고 가정할때,
               ObjectMove()함수로 전달되는 argument는 N개 일수 있고, 서버에서는 ObjectMove()의
               입력 인자 수에 맞추어 데이터를 packing해 클라이언트로 전달해 클라이언트의 ObjectMove() 함수를
               실행하도록 하는 방법 입니다.

와 같이 구현하였으며, 제가 개인적으로 만들어둔 Coroutine Interface에 맞춰 봤습니다.

그리고, 테스트 코드로...


void invoke_test( int a, int b, int c)
{
 fprintf( stderr, " %d, %d, %d\n", a, b, c);
}

int _tmain(int argc, _TCHAR* argv[])
{
   ...
   int arg[3] = { 10, 20, 30 };
   CoSingleInvoke( NULL, 0, (ULONG_PTR)&invoke_test, (char *)arg, sizeof(arg));
   ...
}

해 보았습니다.

서버와 클라이언트간 패킷 interface가 상당히 깔끔해 질수 있을듯 합니다.

^^