게임 렉 백서 › 동기화 설계
지연 보상 없는 판정 Server-now hit validation
원인 ID sy-no-lagcomp · 주 담당 게임개발팀·서버 개발 · 함께 게임개발팀·클라이언트 개발
그림과 실험이 있는 원본 카드로 열기 →
서버가 “지금 서버에 있는 위치”로만 명중을 판정하면, 내가 본 화면과 판정이 어긋납니다.
왜 내 화면의 상대는 약 0.2초 과거 위치(핑 150ms, 보간 100ms일 때) → 그러면 서버는 현재 위치로 판정해 내가 조준한 곳엔 이미 없음 → 화면에서는 분명 맞혔는데 빗나감. 움직이는 대상을 앞질러 쏴야 함
- 증상
- 씹힘·롤백
- 요인
- 지연
- 누가 겪나
- 나만
- 언제
- 특정 행동을 할 때
- 담당
- 주 담당 게임개발팀·서버 개발 · 함께 게임개발팀·클라이언트 개발
- 게임개발팀 할 일
- 서버: 공격자가 보던 시점으로 되감아 판정(지연 보상), 또는 대상 지정 방식으로 바꾸기. 클라이언트: 공격할 때 자기가 보던 시점(보간 중인 서버 시각)을 함께 보내기.
- 그래프에서는
- 일부만 높음 · 움직이는 대상 명중률(핑 구간별)
- 확인할 곳
- 서버 판정 로그에 공격 시각, 공격자 화면의 대상 위치(클라이언트가 보낸 값), 판정에 쓴 서버의 대상 위치, 공격자 RTT를 함께 남김. 개발 빌드에서 서버가 판정에 쓴 위치를 클라이언트 화면에 겹쳐 그리면 바로 보임
- 이러면 맞음
- 빗나간 판정에서 두 위치 차이가 대략 대상 속도 × (공격자 RTT + 보간 시간)이고, 핑이 높을수록 움직이는 대상의 명중률만 떨어짐
- 이러면 아님
- 멈춰 있는 대상도 빗나가면 판정 박스·충돌 검사 문제. 되감기를 하는데도 어긋나면 클라이언트가 보간 시간을 서버에 잘못 알리는지 봄
- 확인 수단
- 게임 서버·클라이언트의 로그·지표가 필요
출처
- Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve
지연 보상이 없으면 지연만큼 앞질러 쏴야 함. 서버가 지연과 보간 시간만큼 되감아 판정하는 지연 보상 - Peeking into VALORANT's Netcode Riot Games
서버가 사격 순간 플레이어가 보던 게임 상태로 되감아 명중 판정, 클라이언트가 보던 시뮬레이션 시각을 함께 보냄 - Source SDK 2013: player_lagcompensation.cpp Valve
Source 엔진의 되감는 시간 = 네트워크 지연 + 보간 시간
함께 보면 좋은 원인
같은 층: 동기화 설계
같은 증상(씹힘·롤백)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기