이동 패킷, 바이트를 줄이면 무슨 일이?
이 영상에 나오는 용어 15개.
- 갱신 빈도 (Hz)
- 1초에 몇 번 상태를 보내는지다. 이동 10Hz는 100ms마다 한 번 위치를 보낸다는 뜻이다.
- 대역폭 병목
- 서버 대수가 CPU나 메모리보다 네트워크 송신량 한도에서 먼저 정해지는 상황이다. 이때만 바이트 절감이 서버 대수 절감으로 바로 이어진다.
- 동접 (CCU)
- 같은 시점에 접속해 있는 유저 수다. 영상의 예시는 5,000명이다.
- 브로드캐스트
- 한 캐릭터의 상태 변화를 그 캐릭터를 보는 모든 클라에게 각각 보내는 것이다. 보는 사람이 50명이면 같은 내용이 50번 나가므로 서버 송신의 대부분을 차지한다.
- 비트 패킹
- 값의 범위에 맞게 바이트나 비트 단위로 필드 크기를 줄여 빈틈없이 채우는 것이다. 상태 값처럼 몇 가지뿐인 값에 4바이트를 쓰지 않는 식이다.
- 스키마 진화
- 이미 배포된 클라와 서버가 섞여 있어도 메시지에 필드를 추가하거나 빼면서 호환을 유지하는 것이다. 프로토버퍼를 쓰는 주된 이유다.
- 양자화
- 연속된 실수 값을 정해진 단계 수로 반올림해 정수로 저장하는 것이다. 방향을 64단계(6비트)로, 좌표를 셀 기준 14비트로 줄이는 것이 그 예이며 정밀도를 일부 포기한다.
- 커스텀 직렬화
- 클라와 서버가 필드 순서와 크기를 미리 약속하고 값만 이어 붙이는 방식이다. 태그가 없어 작지만 형식이 바뀌면 양쪽을 같이 고쳐야 한다.
- 프로토버퍼 (Protocol Buffers)
- 스키마 파일로 메시지를 정의하고 여러 언어용 직렬화 코드를 생성해 주는 형식이다. 필드마다 번호 태그를 붙여 보내므로 필드 추가·삭제에 강하지만 그만큼 바이트가 붙는다.
- 필드 태그 · 길이 접두
- 프로토버퍼가 각 필드 앞에 붙이는 "필드 번호와 타입" 바이트, 그리고 중첩 메시지나 bytes 앞에 붙는 길이 값이다. 영상의 빨간 칸이 이것이다.
- AOI (Area of Interest)
- 한 플레이어가 볼 수 있는 주변 범위다. 서버는 AOI 안의 대상에게만 이동을 보내며, 8B 예시는 캐릭터 ID 대신 AOI 안의 슬롯 번호를 쓴다.
- MSS
- 패킷 하나에 실을 수 있는 최대 페이로드 크기다. 일반적인 이더넷 환경의 TCP에서 1,460B가 흔한 값이며, 영상은 이를 예시로 쓴다.
- N² 트래픽 (보스존)
- N명이 한곳에 모여 서로를 모두 보면 각자 N명에게 받고 N명에게 보내져 전체 트래픽이 N²에 비례한다. 그래서 바이트를 줄인 효과가 수용 인원에는 제곱근으로 나타난다.
- pps (packets per second)
- 초당 처리하는 패킷 수다. 같은 바이트라도 패킷 수가 많으면 헤더와 커널·NIC 처리 비용이 늘어난다.
- Δt
- 기준 시각과의 시간 차이다. 절대 시각 대신 작은 차이 값만 보내 바이트를 줄인다.