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가 빠져 있다.
- 같은 존에 있는 플레이어 전원이 동시에 느려진다. 각자의 핑은 그대로인데 반응만 늦다.
- 50ms는 20Hz일 때의 예산이다. 30Hz라면 33ms, 10Hz라면 100ms가 예산이다.
- 여유가 0에 가까우면 작은 스파이크도 바로 렉이 된다. 영상은 p99 처리시간을 예산의 70~80% 안쪽으로 두어야 안전하다고 하며, 이 수치는 예시로 표시되어 있다.
03끊김과 왜곡
느려지는 건 반응만이 아니다 · ▶ 이 장면 보기
왼쪽은 상대 캐릭터가 내 화면에서 움직이는 모습이다. 정상일 때는 서버 스냅샷이 50ms마다 고르게 도착하고, 과부하일 때는 120ms 이상 간격으로 불규칙하게 도착한다. 아래쪽 점이 스냅샷이 도착한 시점이다. 클라이언트는 받은 스냅샷 사이를 보간해서 부드럽게 그리는데, 스냅샷 간격이 벌어지면 그릴 재료가 떨어진다.
- 보간 버퍼가 바닥난다. 다음 스냅샷이 오지 않아 캐릭터가 멈칫했다가 순간이동한다.
- 타이머를 틱 횟수로 세는 구현이면 쿨다운, 버프, 도트(지속 피해)가 늘어진다. 8Hz로 떨어지면 10초 버프가 약 25초가 된다. 실제 시각으로 세면 밀린 틱 하나 정도만 늦다.
- 서버가 밀린 틱을 몰아서 실행하면 CPU가 급등하고, 그 때문에 다시 지연되는 악순환이 생긴다.
- 틱 사이 경과 시간인 dt가 커진다. 한 번에 이동하는 거리가 길어져 충돌 판정을 놓치거나 이동 검증이 정상 이동을 핵으로 오탐할 수 있다.
틱이 늦어지면 반응 속도만 떨어지는 데서 끝나지 않고, 화면 속 세상의 움직임 자체가 끊긴다.
04RTT란
내 패킷이 서버까지 갔다 돌아오는 시간 · ▶ 이 장면 보기
RTT는 내 패킷이 서버까지 갔다가 돌아오는 시간이다. 업링크와 다운링크가 각각 대략 RTT의 절반이다. 게임에 표시되는 핑 숫자는 보통 이 왕복 시간이며, 서버의 틱 대기는 빠져 있는 경우가 많다.
아래 두 레인은 같은 서버에서 RTT만 다른 경우다. 내 행동의 결과가 돌아오기까지 업링크, 틱 대기, 처리, 다운링크를 차례로 거친다. 영상에서는 틱 대기 25ms, 처리 10ms로 고정했고, RTT 30ms면 65ms 후, RTT 200ms면 235ms 후에 결과가 도착한다.
서버 성능이 같아도 RTT가 크면 결과는 그만큼 늦게 돌아온다.
05RTT가 느리면
나의 결과도, 남이 보는 나도 늦어진다 · ▶ 이 장면 보기
RTT가 길 때 생기는 일을 네 장의 카드로 보여준다.
- 결과 확인이 늦다. 클라이언트 예측 덕분에 내 화면의 캐릭터는 바로 움직이지만, 데미지나 아이템 획득 같은 확정은 RTT와 틱을 거친 뒤에 온다. 카드에서는 시전 후 235ms 동안 확인 대기 상태였다가 -1,240 데미지가 확정된다.
- 남들이 보는 나는 과거의 나다. 상대 화면에 보이는 내 위치는 내 RTT/2, 서버 틱 대기·처리, 상대 RTT/2, 보간 지연이 더해진 만큼 늦은 위치이고, 합치면 수백 ms 전이 된다.
- 판정이 어긋나고 엄폐물 뒤에서 맞는다. 내 화면의 적은 과거 위치에 있으므로, 서버는 시간을 되감아 내가 쏜 시점 기준으로 판정한다(랙 보상). 그 결과 상대는 이미 벽 뒤로 들어간 뒤에 맞는다.
- 예측 오차와 러버밴딩이 커진다. 서버의 보정이 늦게 올수록 클라이언트는 더 멀리 갔다가 더 크게 되돌아온다. RTT 30ms와 200ms 레인을 비교하면 200ms 쪽의 되돌림 폭이 크다.
마지막 줄은 지터를 다룬다. 도착 간격이 들쭉날쭉하면 보간 버퍼를 키워야 하고, 버퍼가 커지면 그만큼 남들의 움직임이 늦게 보인다.
06정리
틱 처리시간 · RTT · 지터는 서로 다른 시간이다 · ▶ 이 장면 보기
세 지표를 표로 비교한다.
틱 처리시간: 서버가 세계를 한 번 갱신하는 시간이다. 커지면 응답 지연, 이동 끊김, 시간 왜곡이 생기고 같은 존 전원이 느낀다.RTT: 내 패킷이 서버까지 갔다 오는 시간이다. 커지면 결과 확인 지연, 판정 불일치, 보정 폭 증가가 생기고 나와 나를 보는 사람이 느낀다.지터: RTT의 흔들림이다. 커지면 보간 버퍼가 부족해 끊기고, 버퍼를 키우면 전체 지연이 늘어난다. 내 업링크 지터는 서버에 도착하는 내 입력을 들쭉날쭉하게 만들어 나를 보는 사람에게도 내 움직임이 끊겨 보인다. 그래서 느끼는 사람은 나와 나를 보는 사람이다.
남의 움직임이 보이는 지연은 내 RTT와 상대 RTT가 같다고 가정하면 RTT + 틱 대기 + 틱 처리 + 보간 + 프레임으로 근사한다. 내 행동의 결과를 확인하는 지연은 RTT + 틱 대기 + 틱 처리이고, 보통 보간은 붙지 않는다. 서버가 느리면 모두가 늦고, RTT가 느리면 나와 나를 보는 사람이 늦는다.
이 영상에 나온 용어는 용어집에 정리했다.