서버가 '지금'을 알려주면 연출은 이미 늦는다
스킬 타격·피격이나 이동 세그먼트를 사건 발생 시점마다 통지하면 네트워크 지연만큼 연출이 어긋난다. 결정적으로 예측 가능한 구간은 타임라인으로 묶어 미리 내려주고, 클라는 로컬 시간에 맞춰 재생한다.
플레이어가 스킬을 쓴다. 서버가 판정을 돌려 “t=0.3s에 A가 맞았다”, “t=0.45s에 B가 맞았다”를 차례로 계산한다. 계산이 끝난 각 시점에 “지금 A 피격” 같은 패킷이 클라로 내려간다.
이상은 깔끔한데, 실제로 클라에서 보면 스킬 모션은 이미 한참 진행 중인데 “맞았다” 신호가 RTT만큼 늦게 도착한다. 피격 연출이 캐릭터 동작과 어긋나고, 체력은 뚝뚝 끊기면서 줄어든다. 서버 쪽에선 분명 정확한 타이밍에 쐈는데 클라에서 보면 맞지 않는다.
이동도 같은 증상이다
A→B로 자동이동 중이라고 하자. 경로가 여러 선분으로 쪼개져 있고, 각 선분의 종점에 다다를 때마다 클라가 서버에 “다음 선분 가도 돼?” 확인을 받는다. 또는 서버가 매 선분 도착 시점에 다음 선분을 내려준다.
RTT만큼의 공백이 선분마다 끼어든다. 캐릭터가 선분 끝에서 잠깐 머뭇거리다 다음으로 이어간다. 장거리 자동이동일수록 이 머뭇거림이 누적돼서 눈에 띈다.
공통 원인 — “지금을 알린다”는 모델
둘 다 같은 모양이다.
- 서버는 사건이 일어나는 순간을 기준으로 패킷을 보낸다
- 클라는 그 패킷이 도착한 순간에 연출을 시작한다
즉 사건과 패킷 도착이 동기화돼 있다. 그 사이에 네트워크 지연이 끼므로, 연출은 항상 네트워크 상태에 끌려간다. 핑이 커질수록 더 튄다.
미리 계산할 수 있는 구간은 미리 보낸다
서버 시뮬레이션은 대개 결정적이다. 스킬 시전 직후 몇 백 ms 동안 누가 언제 맞을지는 시전이 확정된 순간에 이미 전부 계산 가능하다. 이동 경로도 자동이동을 시작하기 전에 몇 개 선분까지는 이미 알고 있다.
그러니 패킷을 사건이 발생하는 시점이 아니라 사건이 확정되는 시점에 내려주면 된다. 스킬의 경우:
- 시전 확정 시 서버가 전체 판정을 미리 돌린다 — 언제 누구한테 데미지 얼마, 경직 얼마
- 결과를 타임라인 하나로 묶어 클라에 내려준다
- 클라는 자기 로컬 시간을 기준으로 타임라인을 재생한다. t=0.3s면 A에 피격, t=0.45s면 B에 피격
네트워크 지연은 타임라인의 시작 지점만 뒤로 밀 뿐, 타임라인 안의 상대 타이밍은 건드리지 않는다. 피격 연출과 데미지 숫자가 캐릭터 동작과 딱 맞는다. 핑이 50ms든 200ms든 연출의 짜임새는 똑같다.
이동: 현재 선분 + 다음 선분까지 선행 전송
이동도 같은 논리다. 지금 선분만 내려주지 말고, 다음 선분까지 같이 선행으로 내려준다.
- 선분 1 (지금 ~ t=0.8s) + 선분 2 (t=0.8s ~ t=1.5s)
클라는 선분 1이 끝나는 순간 네트워크를 기다릴 필요 없이 즉시 선분 2로 이어간다. 선분 2를 진행하는 사이에 서버가 선분 3을 내려주면, 선분 2 끝에서도 역시 이음매 없이 이어진다. 지연이 조금 커져도 “다음이 이미 내 손에 있으니까” 머뭇거림이 안 생긴다.
전제 — 결정론과 무효화
이 방식이 성립하려면 서버의 예측이 실제 진행과 어긋나지 않아야 한다. “t=0.3s에 A가 맞는다”고 미리 내려보냈는데 그 시점에 A가 은신했거나, 무적 상태가 됐거나, 죽어 있으면 이미 보낸 타임라인이 거짓말이 된다.
실전에서는 두 축으로 푼다.
- 무효화 메시지 — 예정됐던 타격/선분을 취소하는 패킷. 클라는 아직 재생하지 않은 타임라인 항목만 지우고, 이미 재생한 것은 보정 연출(피가 다시 차거나, 위치가 스냅되거나)로 맞춘다
- 덮어쓰기 — 새 타임라인을 보내면서 이전 타임라인을 특정 시점 이후로 잘라낸다. 경로 변경이나 스킬 캔슬이 여기에 해당한다
타임라인 구간이 짧을수록 보정 빈도가 낮아지는 대신 네트워크 왕복이 자주 필요해지고, 길수록 지연에 강해지는 대신 도중에 틀어질 확률이 커진다. 구간 길이는 이 트레이드오프에서 결정된다.
뭘 얻나
이 모델의 핵심은 클라의 연출 타이밍을 네트워크에서 떼어낸 것이다. 서버-클라 관계가 “매 사건마다 실시간 통지”에서 “예측 가능한 구간을 묶어 선행 전달 + 틀어지면 보정”으로 바뀐다.
결과는 단순하다. 지연이 있어도 타격감이 무너지지 않고, 긴 자동이동도 매끄럽게 이어진다.
Takeaway
이벤트 시점마다 패킷을 쏘는 모델에서는 클라가 항상 네트워크 지연만큼 뒤쳐진 상태로 연출한다. 결정적으로 예측할 수 있는 구간은 타임라인으로 묶어 미리 내려주고, 클라는 로컬 시간 기준으로 재생하면 된다. 이동은 다음 선분까지 선행 전송해서 이음매를 없앤다. 통지 모델을 “지금”에서 “다음”으로 바꾸는 것이 이 기법의 전부다.