RMI나 이벤트 콜백을 받으면, 어느 호스트로부터 온 콜백인지 식별하기 위해 Proud.HostID 를 같이 받습니다. 게임 서버 개발시, Proud.HostID 를 받으면 이 값을 근거로 해당 Host에 대한 객체를 검색한 후 그 객체를 다루기 마련입니다. ProudNet의 샘플 프로그램도 대부분 이러한 방식으로 만들어져 있습니다.
Host Tag란, 로컬 호스트 및 타 호스트에 대해 Host ID말고도 사용자가 정의할 수 있는 식별용 데이터입니다. 이를 활용하면 프로그램의 성능을 더 올릴 수 있습니다. 아래와 같이요.
OnClientJoin(CNetClientInfo* clientInfo) { // OnClientJoin 함수 실행 중간에 호스트가 나간경우 SetHostTag이 실패할수있습니다. // 따라서 아래와같이 체크하는것이 좋습니다. CNetClientInfo outInfo; if(m_client->GetClientInfo(clientInfo->m_HostID,outInfo)) { Host* r = new Host; SetHostClientTag(clientInfo->m_HostID, r); } } DEFRMI_XXX_YYY(MYCLASS) { void* tag = RmiContext.m_hostTag; // SetHostTag이 실패했다면, RmiContext.m_hostTag이 NULL일수 있으므로 체크가 필요합니다. if(tag != NULL) { Host* obj = (Host*)tag; // 찾는 비용 없음 obj->Something(); } }
만약 Host Tag를 쓰지 않는다면 아래와 같았을 것입니다.
DEFRMI_XXX_YYY(MYCLASS)
{
Host* obj = Lookup(HostID); // 찾는 비용 발생
if(obj != NULL)
obj->Something();
}
그림 20-1Host Tag
Host Tag는 다음과 같은 메서드로 지정합니다.
• Proud.CLanClient.SetHostTag
• Proud.CLanServer.SetHostTag
그리고 HostTag은 Proud.RmiContext.m_hostTag과 Proud.CNetPeerInfo.m_hostTag을 통해 받아집니다.
Host Tag은 네트웍으로 동기화가 일어나지 않습니다. 즉 상대방에게 전파되지 않습니다!