프로그래밍/General

멀티 플레이 게임서버 구현 4편: 지연 보정

Lou Park 2023. 9. 29. 16:36

들어가며

이 글은 https://www.gabrielgambetta.com/lag-compensation.html의 글을 공부하면서 옮긴 것으로, 번역과 의역이 섞여있습니다.

이전 3편에 걸친 글에서 다룬 클라이언트 - 서버 아키텍쳐에대한 설명은 다음과 같이 요약할 수 있습니다.

  • 서버는 모든 클라이언트에서 타임스탬프와 함께 입력을 받습니다.
  • 서버는 입력을 처리하고 월드 상태를 업데이트 합니다.
  • 서버는 모든 클라이언트에게 정기적으로 월드 스냅샷을 전송합니다.
  • 클라이언트는 입력을 전송하고 로컬에서 그것을 시뮬레이션 합니다.
  • 클라이언트는 월드를 업데이트 받고
    • 로컬에서 예측한 상태를 서버에서 받은 상태와 동기화 합니다.
    • 다른 엔티티의 과거 상태를 보간합니다.

플레이어의 관점에서 이것은 2가지 중요한 결과를 가져옵니다.

  • 플레이어는 “현재” 자신을 봅니다.
  • 플레이어는 다른 엔티티의 “과거”를 봅니다.

이러한 상황은 일반적으로 괜찮지만, 시/공간에 민감한 이벤트에 대해서는 상당히 문제가 될 수 있습니다. 예를들면 “헤드샷”같은 것 말이죠.

 

 

지연 보정 (Lag Compensation)

당신은 적의 머리를 “정확히” 조준하고 스나이퍼 라이플의 방아쇠를 당겼습니다.

 

...하지만 빗맞혔죠.

 

왜 그럴까요?

 

이전에 설명한 클라이언트-서버 아키텍쳐 때문에 당신은 총을 쐈을때 적의 머리가 아닌, 총을 쏘기 100ms전의 적의 머리를 조준하고 있었기 때문입니다. 어떤 면에서 보면 이것은 빛의 속도가 정말 느린 우주에서 게임을 하는 것과 유사합니다. 눈에 들어왔을땐 이미 늦어버린 거죠…

 

다행히도 이에 대한 해결책은 있으며, 작동방식은 다음과 같습니다.

  • 당신이 총을 쐈을때, 클라이언트는 이 이벤트를 서버에 총을 쏜 타임스탬프와, 무기 조준 상태와 함께 전송합니다.
  • *중요: 서버는 모든 타임스탬프가 포함된 입력을 받기 때문에 과거의 어느 순간이든 월드를 재구성할 수 있습니다. 네, 서버는 어떤 클라이언트가 언제든지 어떤 시점에서 어떻게 보였는지를 정확히 재구성할 수 있죠.
  • 이것은 서버가 당신이 총을 쐈을때 총의 에임이 어디를 향하고 있었는지 정확하게 알 수 있음을 의미합니다. 서버는 이제 당신의 “현재”에서 겨눈 에임의 위치가 적의 머리였다는걸 알 수 있죠.
  • 서버는 그 당시의 샷을 처리하고 클라이언트를 업데이트합니다.

이제 모든 사람들이 행복해졌습니다!

헤드샷을 맞은 적은…아마도 그렇진 않겠지만요.

 

 

결론

이것으로 “Fast-paced Multiplayer” 시리즈가 마무리되었습니다. 이러한 유형의 문제는 분명 처리하기 복잡해보이지만, 어떤 일들이 일어나는지에 대한 명확한 개념적 이해가 있다면 그렇게 어려운 것은 아닙니다.

 

이 시리즈에서 다룬 사항들을 Live Demo로 테스트하고 싶다면 여기를 한번 방문해보시는 것을 추천드립니다.

https://www.gabrielgambetta.com/client-side-prediction-live-demo.html

 

 

시리즈 모두 보기

1편: 클라이언트 - 서버 아키텍쳐 
2편: 클라이언트측 예측과 서버측 재조정 
3편: 엔티티 인터폴레이션
[*] 4편: 지연 보상