← 위키
2026년 4월 21일
Precomputed Timeline Dispatch 패턴
사건 발생 시점이 아니라 사건이 확정되는 시점에 타임라인을 묶어 내려보내, 클라 연출 타이밍을 네트워크 지연에서 분리하는 서버-클라 동기화 모델
핵심 개념
| 용어 | 정의 |
|---|---|
| 통지 모델 (Notify-on-event) | 서버가 사건이 일어나는 매 순간 패킷을 보내는 방식 |
| 타임라인 디스패치 (Timeline Dispatch) | 사건이 확정되는 시점에 향후 구간 전체를 한 번에 내려보내는 방식 |
| 시작 시점 정렬 | 클라가 타임라인의 t=0를 자기 로컬 시간 기준으로 잡고 재생 |
| 무효화 메시지 | 예정됐던 타임라인 항목을 재생 전에 취소하는 패킷 |
| 덮어쓰기 (Override) | 새 타임라인을 보내며 기존 타임라인을 특정 시점 이후로 잘라내는 것 |
| 보정 연출 | 이미 재생된 타임라인이 실제와 어긋났을 때 위치/체력을 스냅·롤백하는 시각적 보정 |
두 모델 대비
| 모델 | 패킷 전송 시점 | 클라 재생 시점 | 네트워크 지연 영향 |
|---|---|---|---|
| Notify-on-event | 사건 발생 순간 | 패킷 도착 순간 | 사건마다 RTT 어긋남 누적 |
| Timeline Dispatch | 사건 확정 순간 | 로컬 시간 기준 재생 | 타임라인 시작 시점만 밀림 (상대 타이밍 보존) |
적용 가능 조건
서버 시뮬레이션이 결정적이고, 사건 확정 시점에 향후 구간을 미리 계산할 수 있어야 한다.
- 스킬: 시전 확정 직후 몇 백 ms 동안 누가 언제 맞고 데미지·경직이 얼마인지 전부 도출 가능
- 자동이동: 경로 선분이 시작 시점에 이미 알려져 있음
- 결정 불가능한 사건(플레이어 입력, 외부 이벤트)은 이 모델로 묶을 수 없다
스킬 적용 예
- 시전 확정 시 서버가 전체 판정 미리 실행 —
(t_offset, target, damage, stagger)리스트 - 결과를 타임라인 한 패킷으로 묶어 내려보냄
- 클라는 로컬 시간 기준으로 t=0.3s에 A 피격, t=0.45s에 B 피격 재생
피격 연출과 데미지 숫자가 캐릭터 모션과 동기화됨. 핑이 50ms든 200ms든 연출 짜임새는 동일.
이동 적용 예 — 선행 전송
지금 선분만 보내지 말고 다음 선분까지 같이 내려준다.
t=0 선분 1 (지금 ~ t=0.8s) + 선분 2 (t=0.8s ~ t=1.5s)
t=0.8 서버가 선분 3 송신
t=1.5 선분 2 종료 시점에 선분 3 이미 도착해 있음 → 즉시 이어감
선분 종점에서 RTT만큼 머뭇거리던 현상이 사라짐. 장거리 자동이동의 누적 지연 제거.
무효화 / 덮어쓰기 처리
미리 보낸 타임라인이 실제와 어긋날 수 있는 경우(은신, 무적, 죽음, 경로 변경, 스킬 캔슬):
| 처리 | 적용 시점 | 클라 동작 |
|---|---|---|
| 무효화 메시지 | 아직 재생 전 | 해당 타임라인 항목 제거 |
| 덮어쓰기 | 새 타임라인 발급 시 | 이전 타임라인을 특정 t 이후로 잘라내고 신규 재생 |
| 보정 연출 | 이미 재생된 항목이 거짓이었을 때 | 체력 회복 / 위치 스냅 등 시각 보정 |
구간 길이 트레이드오프
| 길이 | 장점 | 단점 |
|---|---|---|
| 짧음 | 도중 무효화 빈도 낮음 | 네트워크 왕복 잦음 |
| 김 | 지연에 강함 | 도중 틀어질 확률 증가 → 보정/롤백 빈도 ↑ |
효과
- 클라 연출 타이밍이 네트워크에서 분리됨
- 핑 변동이 타격감을 무너뜨리지 않음
- 긴 자동이동이 매끄럽게 이어짐
일반화
“지금” 통지에서 “다음” 선행 전달로 모델 전환.
서버-클라 관계가 매 사건마다 실시간 통지 에서 예측 가능한 구간을 묶어 선행 전달 + 틀어지면 보정 으로 바뀌는 것이 본질.
관련
- 블로그: precomputed-timeline-dispatch 원문 글
- 관련 패턴: observable-range-sync — 서버 내부 Grid 동기화 (다른 축의 동기화 문제)
- 관련 개념: game-server-request-context — 사건 단위 컨텍스트 전파