게임 렉 백서 › 동기화 설계
타임스탬프 없는 도착 즉시 재생 Events played on arrival (no timestamps)
원인 ID sy-no-timestamp · 주 담당 게임개발팀·클라이언트 개발 · 함께 게임개발팀·서버 개발
그림과 실험이 있는 원본 카드로 열기 →
서버 이벤트에 발생 시각을 붙이지 않고 받자마자 재생하면, 네트워크 지터 때문에 연출 타이밍이 그대로 들쭉날쭉해집니다.
왜 “공격 시작”, “이펙트 재생” 이벤트를 도착 즉시 실행 → 그러면 패킷마다 도착 시간이 달라 간격이 들쭉날쭉 → 화면에서는 연속 공격 모션이 빨라졌다 느려졌다, 보스 패턴 타이밍이 매번 다름
- 증상
- 뚝뚝 끊김, 몰아치기
- 요인
- 지터
- 누가 겪나
- 나만
- 언제
- 항상
- 담당
- 주 담당 게임개발팀·클라이언트 개발 · 함께 게임개발팀·서버 개발
- 게임개발팀 할 일
- 클라이언트: 이벤트에 붙은 시각에 맞춰 재생(이벤트 예약·보간 버퍼). 서버: 이벤트에 발생 시각(서버 시각)을 붙여 보내기.
- 그래프에서는
- 가끔 무작위로 튐 · 이벤트 재생 간격, 패킷 도착 간격
- 확인할 곳
- 서버 로그의 이벤트 발생 시각과 클라이언트 로그의 도착·재생 시각을 이벤트 번호로 맞춰 간격을 비교. 개발 빌드에서 지터를 넣어(tc netem의 지터 값, Unreal 네트워크 에뮬레이션의 최소·최대 지연) 재현해 봄
- 이러면 맞음
- 서버에서 잰 발생 간격은 일정한데 재생 간격이 도착 간격을 그대로 따라 들쭉날쭉함
- 이러면 아님
- 도착 간격은 고른데 재생이 들쭉날쭉하면 클라이언트 프레임 문제(프레임 타임 스파이크). 서버 발생 간격부터 흔들리면 틱 예산 초과
- 확인 수단
- 게임 서버·클라이언트의 로그·지표가 필요
출처
- Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization (Yahn W. Bernier, GDC 2001) Valve
업데이트마다 서버 시각을 붙이고 현재 시각에서 보간 시간(100ms)을 뺀 목표 시각의 위치로 그림 - Snapshot Interpolation Gaffer On Games
받은 스냅샷을 바로 그리면 지터 때문에 끊기고 보간 버퍼에 잠깐 모았다 그리면 매끄러움 - NetworkTime and ticks (Netcode for GameObjects 2.5) Unity
RPC에 보낸 시각을 담아 받는 쪽이 서버 시각에 맞춰 효과를 재생하는 예 - tc-netem(8) — Linux manual page iproute2
나가는 패킷에 지연·지터(delay TIME JITTER)와 손실(loss random PERCENT)을 넣어 실제 네트워크를 흉내 내는 시험 도구 - Using Network Emulation in Unreal Engine Epic Games
서버·클라이언트에 최소·최대 지연과 패킷 손실 비율을 넣어 시험, 콘솔에서는 NetEmulation.PktLag처럼 설정
함께 보면 좋은 원인
같은 층: 동기화 설계
같은 증상(뚝뚝 끊김)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기