20.각 호스트에 대한 사용자 정의 데이터(Tag)

Edit

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

Proud.CNetClient.SetHostTag

Proud.CNetServer.SetHostTag

그리고 HostTag은 Proud.RmiContext.m_hostTagProud.CNetPeerInfo.m_hostTag을 통해 받아집니다.

Host Tag은 네트웍으로 동기화가 일어나지 않습니다. 즉 상대방에게 전파되지 않습니다!