클라이언트 측 예측은 어떻게 작동합니까?


33

Google에서 Valve + Gafferon과 수백 페이지를 읽었지만 어떤 이유로 든 고객 예측에 대해 알 수 없습니다.

내 이해에는 기본 문제는 다음과 같습니다.

  • 클라이언트 A는 T0
  • 서버는에서 입력을받습니다. T1
  • 모든 고객은 T2

에서 T2그러나, 클라이언트 예측을 사용하여, 클라이언트 A는에 위치 적절한에서 지금이다 T4.

서버가 이동 요청을 수락 할 것으로 예측할 때 클라이언트 A가 서버보다 앞서지 않도록하려면 어떻게해야합니까? 분명히 그들이 앞으로 나아갈 때마다 서버가 마지막으로 본 위치로 돌아갑니다. 내가 시도한 모든 수정 사항으로 서버가 뒤에서 멈추기 때문에 중지 할 때 여전히 눈에.니다.

답변:


35

나는 이것 에 관한 일련의 기사 를 썼다 . 그것은 다른 곳에서 읽은 것과 같은 아이디어를 기반으로하지만 매우 자세하고 접근하기 쉬운 방법으로 설명되었습니다.

특히, 클라이언트 측 예측에 관한 기사는 이것 입니다.


우수한 기사 :-) 나는 시리즈의 네 번째 부분을보고 싶습니다. 작은 제안으로, 각 기사의 끝에서 다음 부분에 대한 링크는 탐색을 확실히 향상시킬 것입니다.
또는 매퍼

5
@ORMapper-마침내 4 번째 기사를 썼습니다! gabrielgambetta.com/fpm4.html
ggambett

당신의 기사 시리즈를위한 Kudos :-) 매우 도움, 감사합니다 :-)
또는 Mapper

저장된 스냅 샷을 사용하여 과거를 재구성하는 방법에 대한 모든 기사 (찾을 수 있음)는 촬영을 예로 들어 설명합니다. 이것은 운동에도 적용됩니까? 다른 플레이어들이 서로 충돌 할 수 있다면 움직임 재 시뮬레이션이 다른 플레이어들에게 큰 차이를 가져올 수 있다고 상상할 수 있습니다. 두 명의 플레이어가 서로를 향해 움직이며 그 중 하나가 충돌 지점에서 "스텝"을 조금만 이동하지 않는다고 가정 해 봅시다. 우리 resimulate 세상이 두 선수는 매우 다른 위치에있을 것입니다, 그래서 만약이 정지 명령은 후반 때문에 지연의 도착
로페

흥미로운 질문입니다. 불행히도, 나는 확실한 대답이 없습니다. 게임의 움직임이 얼마나 중요한지에 달려 있다고 생각합니다. 다른 사람에게 부딪 히고 아무 일도 일어나지 않습니까? 이 경우 서버는 신경 쓰지 않을 것입니다. 예측 실수로 간주됩니다 (우리는 모두 질식 지점에서 발생하는 것을 보았습니다). 당신은 접촉에서 다른 플레이어를 죽입니까? 어떤 경우에는 일부 패킷을 "너무 오래된"것으로 폐기해야합니다. 그렇지 않으면 언제든지 t = 0에서 잠재적으로 다시 시뮬레이션하게됩니다.
ggambett

4

나는 실제로 이것을 구현하지 않았으므로 (즉시 보이지 않는 몇 가지 문제가있을 수 있음) 도움을 줄 것이라고 생각했습니다.

당신이 말한 것은 다음과 같습니다.

클라이언트 A는 T0에서 입력을 보냅니다.

서버는 T1에서 입력을받습니다.

모든 고객은 T2에서 변경 사항을받습니다.

그러나 T2에서 클라이언트 예측을 사용하여 클라이언트 A는 이제 T4에 적합한 위치에 있습니다.

서버 시간 측면에서 생각하는 것이 유용 할 것입니다. 보간 작동 방식과 매우 유사 합니다.

모든 명령은 서버 시간과 함께 전송됩니다. 이 서버 시간은 핑 시간을 보상하여 서버 틱을 쿼리하여 경기 시작시 계산됩니다. 클라이언트에서 당신은 당신의 자신의 로컬 틱 카운트를 가지고 있고 당신이 전송하는 각 명령은 서버 틱으로 변환됩니다 (간단한 빼기 연산입니다)

또한 클라이언트는 항상 "과거에"렌더링합니다. 따라서 클라이언트가 보는 세계는 서버 시간이 실제로 100ms 뒤에 있다고 가정합니다.

따라서 서버 시간 (S로 지정)으로 예제를 바꾸겠습니다.

클라이언트는 서버 시간이 S0 인 T0에서 입력을 보냅니다 (실제로 "서버 시간에서 보간 시간을 뺀 클라이언트 표현"이라고 생각합니다). 클라이언트는 서버의 응답을 기다리지 않고 즉시 이동합니다.

서버는 T1에서 입력을받습니다. 서버는 클라이언트가 제공 한 서버 시간 S0에서 클라이언트의 권한있는 위치를 파악합니다. 클라이언트에게 보냅니다.

클라이언트는 T2에서 정식 위치를받습니다 (여전히 서버 시간 S0을 지정 함). 클라이언트는 이전 이벤트 (어쩌면 모든 확인되지 않은 예측의 대기열)에 해당하는 과거 시간을 추적합니다.

서버가 S0에서 다시 전송하는 위치 / 속도 / 예상치가 클라이언트가 S0에 저장 한 것과 다를 경우, 클라이언트는이를 어떻게 처리합니다. 플레이어를 과거의 위치로 되돌 리거나 이전 입력을 다시 시뮬레이션하거나 내가 생각하지 못한 다른 것을 시도합니다.


3
과거의 클라이언트 렌더링에 대한 비트를 제외하고는 모두 정확합니다. 서버와 관련하여 클라이언트는 실제로 미래에 렌더링됩니다! 서버는 각 클라이언트의 정보가 오래되었으며 이후 각 클라이언트가 이미 변경되었음을 알고 있습니다.
Kylotan

2

실제로 github에는 오픈 소스 구현이 있으며이를 수행하는 방법을 보여줍니다. Lance.gg를 확인하십시오

github 저장소 : https://github.com/lance-gg/lance

클라이언트 예측 코드는 src/syncStrategies/ExtrapolateStrategy.js

외삽 외에도 위에서 언급하지 않은 두 가지 개념이 있습니다.

  1. 증분 벤딩. 기본적으로 서버 수정을 한 번에 모두 적용하는 대신 델타를 조금씩 적용 할 수 있습니다. 이렇게하면 원격 객체가 서버 위치와 일치하도록 점차적으로 위치를 조정합니다. 위치 굽힘, 속도 굽힘, 각도 굽힘 및 각속도 굽힘이 있습니다. 또한 물체마다 다른 굽힘 계수를 원할 수 있습니다.
  2. 단계 재연. 데이터가 과거에 있다는 사실은 서버 데이터 시간으로 시간을 롤백하고 그 시점부터 다시 시작할 수 있음을 의미합니다. 물론, 당신은 여전히 ​​새로운 위치로 넘어 가지 않고 새로운 위치로 구부러져 야합니다.

1

클라이언트 A는 항상 서버보다 앞서 있지만 중요하지 않습니다. 서버가보고 된 위치에 문제가 있다고 말한 경우에만 클라이언트를 다시 스냅하면됩니다.이 시점에서 클라이언트는 수정 된 값으로 오류 이후에 작성된 모든 변경 사항을 다시 실행하여 호환 가능한 상태로 만듭니다. 서버와 함께.

이를 위해 클라이언트는 과거 상태 및 과거 업데이트 중 일부를 기억해야합니다. 이것은 위치, 속도, 방향과 같은 단순한 값일 수 있습니다. 서버는 정기적으로 다양한 클라이언트 업데이트가 합법적이라는 확인 메시지를 보내므로 클라이언트에서 잊어 버릴 수 있습니다. 그러나 서버가 업데이트가 유효하지 않다고보고하면 클라이언트 상태가 해당 지점으로 롤백되고 향후 변경 사항이 해당 수정 된 상태에 적용됩니다.

Valve 기사의 맨 아래에는 읽을 가치가있는 추가 링크가 있습니다. https://developer.valvesoftware.com/wiki/Prediction


그래서, (에서 클라이언트가 그 권리의 생각에서이다 t=4)에 대한 정보를 수신 t=2이 상태를 재설정 있도록로 t=2에서 개체를 가져올에 다음 다시 실행 업데이트 t=2t=4?
George Duckett

나는 아직도 어떤 이유로 그것을 잡지 못하고 있습니다. 서버는 플레이어의 위치를 ​​알려주지 않고 입력 만 알려줍니다. 그래서 플레이어는 서버가 말했던 마지막 위치에서 움직이고 있습니다. 입력이 적용됩니다. 서버에 알립니다. 서버는 모든 사람에게 입력을 확인합니다. 모든 명령이 승인되었다고 가정하면 서버는 여전히 클라이언트 A 뒤에 있습니다. 따라서 클라이언트 A가 중지되면 해당 문자가 즉시 중지되고 중지 확인을 받으면 서버 위치로 다시 이동합니다.
크리스 에반스

@GeorgeDuckett : 예 (이것은 t 4 =해야하지 않지만, 그것은 불일치가 감지 될 때마다 할 수 있고, 재 적용되는 업데이트의 수있을 수 있습니다.)
Kylotan

@ChrisEvans : 알려진 상태 + 입력에 따른 변화는 어쨌든 상태를 보내는 것과 같습니다. 중지 예제는 그 자체가 입력이며 서버는 해당 입력을 수신 할 때까지 여전히 움직임을 시뮬레이션합니다. 대기 시간이 일정하다고 가정하면 서버는 클라이언트가 서버보다 앞서 있기 때문에 클라이언트가 이동을 멈췄을 때와 정확히 같은 위치에서 플레이어 이동을 중지합니다. (실제로 대기 시간이 다양하므로 조금 보간하여 부드럽게 처리합니다.)
Kylotan
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.