더북(TheBook)

위의 가정에 따르면 결과적으로 Y 값을 직렬화하는 데 필요한 기대 비트 수가 32비트에서 4.2로 줄었다. 위치 값 하나마다 약 3바이트꼴로 절약한 것이다. 32명의 플레이어가 초당 30회 정도 위치를 바꾼다면 Y 값 하나 최적화했을 뿐인데도 엄청난 절약이 가능하다는 결론에 이르게 된다.

압축 효율을 더 높일 수도 있다. 예를 들어 통계를 얻어본 결과 고양이가 바닥에 있는 경우가 아니라면 대개 천장에 매달려 있었다고 가정해 보자. 천장의 높이가 100이라면 직렬화 코드에 두 번째 기댓값 여부 검사를 넣어 천장에 매달린 경우의 위치를 압축할 수 있다.10

void OutputMemoryBitStream::WritePos(const Vector3& inVector)
{
    Write(inVector.mX);
    Write(inVector.mZ);
    
    if (inVector.mY == 0)
    {
        Write(true);
    }
    else if (inVector.mY == 100)
    {
        Write(true);
        Write(false);
    }
    else
    {
        Write(false);
        Write(inVector.mY);
    }
}

 


 

10  역주 이 코드에서는 간결한 설명을 위해 float 값을 등가 연산자로 직접 비교하는데, 부동소수점 포맷에 내포된 오차로 인해 상상도 못 한
버그가 생길 수 있다. 실전에서는 fabs(inVector.mY - 100.0f) 0.001f 식으로 하는 것이 안전하다.

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