1:23 · tick budget · RTT · jitter · lag compensation

50ms와 RTT, 렉은 어디서 생길까?

게임 서버가 느릴 때와 네트워크 왕복 시간(RTT)이 길 때 플레이어가 겪는 지연이 어떻게 다른지 설명하는 영상이다. 서버의 틱 처리시간이 틱 간격(20Hz 기준 50ms)을 넘으면 같은 존의 모든 플레이어가 함께 늦어지고, RTT가 길면 그 플레이어와 그 플레이어를 보는 사람이 늦어진다. 남의 움직임이 내 화면에 보이는 지연은 RTT(나와 상대가 같다고 가정), 틱 대기, 틱 처리, 보간, 프레임 시간을 더한 값으로 정리한다.

01틱은 서버 세계의 시계

세계는 틱마다 한 칸씩 움직인다 · ▶ 이 장면 보기

게임 서버는 요청이 올 때마다 바로 처리하지 않고, 정해진 간격마다 세계 전체를 한 번씩 갱신한다. 이 한 번의 갱신을 틱이라고 한다. 화면의 T1, T2 … 칸이 틱이고, 20Hz 서버라면 50ms마다 한 칸씩 진행된다.

예시 막대에서 한 틱의 처리에 30ms가 걸리고 남은 20ms는 여유로 표시된다. 서버가 정상적으로 돌아가는 조건은 하나, 한 틱의 처리시간이 틱 간격보다 짧아야 한다는 것이다.

틱 간격은 틱레이트로 정해진다. 10Hz = 100ms, 20Hz = 50ms, 30Hz = 33ms, 60Hz = 16.7ms이다. 영상은 MMO가 보통 10~20Hz, 빠른 액션 게임과 FPS는 20~128Hz로 게임마다 다르다고 소개한다.

0250ms를 넘으면

다음 틱이 밀리고, 기다림과 처리가 함께 늘어난다 · ▶ 이 장면 보기

위 레인은 정상 상태로 처리 30ms, 20Hz를 유지한다. 아래 레인은 과부하 상태로 한 틱 처리에 120ms가 걸린다. 처리가 끝나야 다음 틱을 시작할 수 있으니 틱 시작이 계속 뒤로 밀리고, 실제 틱레이트는 약 8Hz로 떨어진다.

플레이어 입력은 도착하자마자 처리되지 않는다. 다음 틱이 시작될 때까지 기다렸다가 그 틱에서 처리되고, 처리가 끝나야 응답이 나간다. 그래서 서버 안에서의 응답 시간은 틱 대기와 처리시간의 합이고, 과부하에서는 두 값이 함께 커진다. 화면의 첫 입력은 정상일 때 70ms, 과부하일 때 180ms가 걸린다. 이 값에는 네트워크 RTT가 빠져 있다.

03끊김과 왜곡

느려지는 건 반응만이 아니다 · ▶ 이 장면 보기

왼쪽은 상대 캐릭터가 내 화면에서 움직이는 모습이다. 정상일 때는 서버 스냅샷이 50ms마다 고르게 도착하고, 과부하일 때는 120ms 이상 간격으로 불규칙하게 도착한다. 아래쪽 점이 스냅샷이 도착한 시점이다. 클라이언트는 받은 스냅샷 사이를 보간해서 부드럽게 그리는데, 스냅샷 간격이 벌어지면 그릴 재료가 떨어진다.

틱이 늦어지면 반응 속도만 떨어지는 데서 끝나지 않고, 화면 속 세상의 움직임 자체가 끊긴다.

04RTT란

내 패킷이 서버까지 갔다 돌아오는 시간 · ▶ 이 장면 보기

RTT는 내 패킷이 서버까지 갔다가 돌아오는 시간이다. 업링크와 다운링크가 각각 대략 RTT의 절반이다. 게임에 표시되는 핑 숫자는 보통 이 왕복 시간이며, 서버의 틱 대기는 빠져 있는 경우가 많다.

아래 두 레인은 같은 서버에서 RTT만 다른 경우다. 내 행동의 결과가 돌아오기까지 업링크, 틱 대기, 처리, 다운링크를 차례로 거친다. 영상에서는 틱 대기 25ms, 처리 10ms로 고정했고, RTT 30ms면 65ms 후, RTT 200ms면 235ms 후에 결과가 도착한다.

서버 성능이 같아도 RTT가 크면 결과는 그만큼 늦게 돌아온다.

05RTT가 느리면

나의 결과도, 남이 보는 나도 늦어진다 · ▶ 이 장면 보기

RTT가 길 때 생기는 일을 네 장의 카드로 보여준다.

마지막 줄은 지터를 다룬다. 도착 간격이 들쭉날쭉하면 보간 버퍼를 키워야 하고, 버퍼가 커지면 그만큼 남들의 움직임이 늦게 보인다.

06정리

틱 처리시간 · RTT · 지터는 서로 다른 시간이다 · ▶ 이 장면 보기

세 지표를 표로 비교한다.

남의 움직임이 보이는 지연은 내 RTT와 상대 RTT가 같다고 가정하면 RTT + 틱 대기 + 틱 처리 + 보간 + 프레임으로 근사한다. 내 행동의 결과를 확인하는 지연은 RTT + 틱 대기 + 틱 처리이고, 보통 보간은 붙지 않는다. 서버가 느리면 모두가 늦고, RTT가 느리면 나와 나를 보는 사람이 늦는다.

이 영상에 나온 용어는 용어집에 정리했다.