더북(TheBook)
inline uint32_t ConvertToFixed(
    float inNumber, float inMin, float inPrecision)
{
    return static_cast<uint32_t> (
        (inNumber - inMin)/inPrecision);
}

inline float ConvertFromFixed(
    uint32_t inNumber, float inMin, float inPrecision)
{
    return static_cast<float>(inNumber) *
        inPrecision + inMin;
}

void OutputMemoryBitStream::WritePosF(const Vector3& inVector)
{
    Write(ConvertToFixed(inVector.mX, -2000.f, 0.1f), 16);
    Write(ConvertToFixed(inVector.mZ, -2000.f, 0.1f), 16);
    ... // Y 값을 여기서 기록함 ...
}

게임 코드는 벡터의 각 요소를 32비트 꽉 찬 부동소수점으로 갖고 있지만, 네트워크상 전송할 때는 직렬화 코드가 이를 0~40000 사이의 부동소수점으로 변환하여 단 16비트만 사용하여 보낸다. 이로써 X와 Z 둘을 합쳐 32비트를 추가로 절약하게 되어 원래 합계 96비트에서 이제 (약) 35비트까지 줄이는데 성공했다.

Note ≣

일부 CPU, 예를 들어 Xbox 360이나 PS3는 부동소수점을 정수로 상호 변환하는데 수행 비용이 많이 들 수 있다. 그럼에도 대역폭이 절약되는 정도를 보면 충분히 감수 가능한 비용일지 모른다. 게임은 저마다 최적화 기준이 제각각이므로 득실 여부를 잘 저울질해보자.

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