더북(TheBook)

예제 시나리오에서 수신자의 RoboCat 생성자는 객체의 초기 상태로 mHealth는 10, mMeowCount는 3으로 초기화했다. 게임 플레이 도중 여러 과정을 통해 송신자가 RoboCat의 ‘냐옹’을 한 번 발사하고, 체력은 절반 잃어버렸다 치자. mHealthmMeowCount는 원시 자료형이므로, 나이브한 송수신 방식으로도 무리 없이 잘 동작한다. 이에 따라 수신자의 최종값은 송신자의 변경된 값과 같게끔 갱신된다.

▼ 표 4-1 메모리상 샘플 RoboCat 데이터의 변화

주소

필드

원본값

대상 초깃값

대상 최종값

바이트 0-3

mHealth

0x00000005

0x0000000A

0x00000005

바이트 4-7

mMeowCount

0x00000002

0x00000003

0x00000002

 

그러나 본격적으로 게임을 개발하다 보면, 핵심 데이터 요소들을 표 4-1의 RoboCat과 같이 간단히 표현할 수 있는 경우는 그다지 많지 않다. 다음과 같이 RoboCat 코드가 추가 개발되면, 더 이상 메모리 레이아웃에 의존하는 단순한 방식으로는 제대로 전송이 되지 않으므로 더욱 견고한 직렬화 시스템이 필요하게 된다.

class RoboCat : public GameObject
{
public:
    RoboCat() : mHealth(10), mMeowCount(3), mHomeBase(0)
    {
        mName[0] = ‘\0’;
    }
 
    virtual void Update();
 
    void Write(OutputMemoryStream& inStream) const;
    void Read(InputMemoryStream& inStream);
 
private:
    int32_t              mHealth;
    int32_t              mMeowCount;
    GameObject*          mHomeBase;
    char                 mName[128];
    std::vector<int32_t> mMiceIndices;
};

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.