원문 : https://www.gabrielgambetta.com/lag-compensation.html
Lag Compensation - Gabriel Gambetta
Fast-Paced Multiplayer (Part IV): Lag Compensation Client-Server Game Architecture · Client-Side Prediction and Server Reconciliation · Entity Interpolation · Lag Compensation · Live Demo Introduction The previous three articles explained a client-server g
www.gabrielgambetta.com
본 게시물은 Gabriel Gambetta가 쓴 Fast-Paced Multiplayer를 해석한 글입니다. 원문과 내용은 거의 같으나 일부 각색이 들어갈 수 있습니다.
혹시 읽으시면서 틀리거나 이상한 부분이 있으면 꼭 댓글에 적어주세요.
Introduction
이전 글들이 설명한 클라이언트-서버 구조를 요약하자면 다음과 같다.
- 서버는 모든 클라이언트들로부터 timestamp와 함께 입력을 받는다.
- 서버는 입력들을 처리하고, 게임 상태를 갱신한다.
- 서버는 모든 클라이언트들에게 정기적으로 게임 스냅샷을 보낸다.
- 클라이언트는 입력값을 보내고, 그 입력을 자체적으로 시뮬레이션한다.
- 클라이언트는 게임 상태를 갱신하고
- 예측한 상태를 서버에서 온 게임 상태에 동기화시킨다.
- 다른 객체들의 알고있는 과거 상태를 보간한다.
유저 시점에서 보면 두 가지 중요한 점이 있다.
- 유저는 현재의 자기 자신을 본다.
- 유저는 과거의 다른 객체들을 본다.
이런 상황은 일반적으로는 괜찮지만, 시간적·공간적으로 민감한 상황에서는 문제가 된다. 예를 들어, 상대의 머리를 쏘는 상황같이!
Lag Compensation
당신은 저격총으로 상대의 머리를 완벽하게 조준하고 있다. 그리고 방아쇠를 당긴다. 이건 빗나갈 수 없는 샷(shot)이다.
그러나 빗나간다.
왜 이런 일이 생긴 것일까?
앞서 설명한 클라이언트-서버 구조에 의하여, 당신은 쏘기 전에 상대의 머리가 100ms 전인 위치를 조준하고 있었던 것이다. 쏠 때가 아니라!
다른 말로는, 빛의 속도가 매우 매우 느린 우주 어디선가 놀고 있는 것과 같다. 당신은 상대의 과거 위치를 조준하고 있고, 방아쇠를 당겼을 때는 이미 멀리 가고 난 후이다.
운 좋게도, 이 문제에 대해서 대부분의 유저들이 만족할만한 상대적으로 단순한 해결법이 있다.
아래와 같은 방법이다.
- 당신이 방아쇠를 당겼을 때, 클라이언트는 정확한 timestamp와 조준 같은 모든 정보를 서버로 보낸다.
- 이게 중요한 부분이다. 서버가 timestamp와 함께 모든 입력을 얻으므로, 게임 상태의 과거 어떠한 순간이라도 재구축할 수 있다.
- 이게 의미하는 것은 서버가 당신이 방아쇠를 당겼을 때 조준경에 무엇이 비쳐있었는지를 정확히 알 수 있다는 것이다. 그게 상대 머리의 과거 위치였지만, 서버는 그게 당신이 현재 본 상대 머리의 위치라는 것을 안다.
- 서버는 그 시점의 샷을 처리하고, 클라이언트들을 갱신한다.
그리고 모두가 행복해진다!
서버도 행복하다. 왜냐하면 서버이기 때문이다. 서버는 언제나 행복하다.
당신도 행복하다. 왜냐하면 헤드샷을 땄기 때문이다.
상대방은 행복하지 않은 유일한 사람일 수도 있다. 만약 그가 맞았을 때 가만히 서있었다면, 할 말은 없을 것이다. 하지만 만약 움직이고 있었다면? 개활지에서 엄폐물로 숨고 나서 안전하다고 생각하고, 잠시 뒤 총에 맞는다면?
일어날 수 있는 일이다. 어찌 보면 불공평해 보일 수 있지만, 모두에게 있어 가장 합리적인 해결법인 것은 틀림없다. 빗나갈 수 없는 샷이 빗나가는 것보다 더 최악은 없기 때문이다!
Conclusion
이 글을 마지막으로 Fast-paced Multiplayer 시리즈는 끝났다. 이런 종류의 것들은 제대로 하기 어렵지만, 어떻게 돌아가는지에 대해서 이해를 하고 있다면, 못할 정도는 아니다.
비록 이 글들의 독자들은 게임 개발자들이겠지만, 관심을 가질 수 있는 다른 독자층이 있다. 바로 게이머(gamer)들이다! 게이머의 관점에서 보면 게임이 어떻게 돌아가는 지에 대해 이해하는 것 또한 흥미로울 것이다.
더 읽을거리
이 글들은 그저 내가 다른 글들이나 소스 그리고 몇몇 실험으로부터 배운 것들을 알기 쉽게 나열한 것이다.
이 주제에 대해 더 알고 싶다면 What Every Programmer Needs to Know About Game Networking과 Latency Compensating Methods in Client/Server In-game Protocol Design and Optimization을 추천한다.