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