클라이언트 측 예측으로 움직이는 물체를 보상하는 방법은 무엇입니까?


11

Star Control과 유사한 melee 을 지원하는 게임 서버를 구현하고 있습니다. 따라서 이동 속도를 높이기위한 초간단 속도 / 가속 / 물리 물리학을 사용하여 선박을 비행하고 사격 할 수 있습니다.

여기에 이미지 설명을 입력하십시오

Valve, Gafferon 및 Gambetta를 읽고 클라이언트 예측을 위해 Gambetta의 알고리즘 을 구현했습니다 .

여기에 이미지 설명을 입력하십시오

클라이언트 예측은 서버가 도착할 때 서버에서 위치를 업데이트 한 다음 아직 서버별로 처리되지 않은 입력을 플레이어 우주선에 다시 적용하여 플레이어 우주선에서 작동합니다.

불행히도 내 게임에서는 잘 작동하지 않습니다. 나는 Gambetta의 예제가 이미 움직이는 객체 또는 단계별로 업데이트되는 명령을 고려하지 않는다는 사실과 관련이 있다고 생각합니다. ( "단계"에 의해 나는 프레임을 의미한다). 따라서 내 게임에서 플레이어는 클라이언트에서 계속 움직이고 (이미 이동하는) 함선을 가속화하기 위해 압력을가합니다. 명령을 서버로 보내고 일반적으로 다음 단계에서 서버에서 월드 스냅 샷을받습니다. 나는 다음과 같은 것을 얻는다 :

여기에 이미지 설명을 입력하십시오

player 명령은 클라이언트 3 단계 에서 실행 되지만 서버에서는 5 단계 에서만 실행됩니다 . 클라이언트 단계 6 에서 월드 스냅 샷이 클라이언트에 의해 수신 될 때 , 특히 더 빠른 속도로 예측이 중단된다.

문제의 핵심은 클라이언트가 5 단계 실행하지만 서버가 6 단계 실행한다는 것 입니다. 명령으로 클라이언트 단계를 보내는 것에 대해 생각하고 서버가 클라이언트 시간 단계로 롤백하고 명령을 다시 실행하도록했습니다. 롤백 이후에 수신 된 명령에서 발생하는 것과 같은 조치 나 전송 된 단계를 변경하여 부정 행위 클라이언트가 악용 할 수있는 방법과 같은 많은 다른 문제점이 발생할 수 있습니다.

읽기와 같은 비디오를보고 이것 구글에서하면 점차적으로 몇 단계에 걸쳐 스냅 샷과 동일하게 플레이어의 위치를 변경 다른 접근 방식을 언급하고있다.

내 질문 :

  • Gambetta의 알고리즘을 일정한 단계 이동으로 작동시킬 수 있습니까? 아니면 내 게임과 개념적으로 호환되지 않습니까?

  • 단계에 대한 점진적 보간이 올바른 방법이됩니까? 그렇다면 서버에서받은 것과 일치하도록 클라이언트 위치에서 이미 움직이는 객체를 어떻게 보간합니까?

  • 이러한 방법, 점진적 보간 및 Gambetta의 알고리즘이 함께 작동 할 수 있습니까? 아니면 상호 배타적입니까?


나는 똑같이하고 똑같은 문제에 부딪쳤다. 서버 상태를 적용하고 입력을 다시 적용하는 속도를 추가하자마자 이미 처리 된 속도 변화를 제거했습니다. 마지막으로받은 메시지 이후 모든 업데이트를 다시 적용하려고했지만 아직 매끄럽지 않습니다. 이것에 대한 해결책을 찾은 적이 있습니까?
MakuraYami

@MakuraYami 예-솔루션을 설명하는 기사를 쓰기 시작했습니다. 곧 업데이트됩니다!
OpherV

나는 프로젝트에서 더 많은 일을 해왔고이 문제에 관해 쓸만한 해결책과 더 좋은 자료를 발견했다. 더 자세히 논의하고, 솔루션 등을 비교하고 싶습니다. 연락 할 수있는 곳을 알려주세요. :)
MakuraYami

@makurayami Gmail에서 내 사용자 이름
OpherV

답변:


5

이 질문을 한 후 6 개월 동안, 나는이 정확한 문제 (그리고 다른 많은 것들!)를 다루기 위해 완전한 오픈 소스 게임 서버를 개발하게되었습니다 .http : //lance.gg

여기에 이미지 설명을 입력하십시오

관련된 R & D를 통해 이제 내 질문에 대답 할 수 있습니다.

  • Gambetta의 알고리즘을 일정한 단계 이동으로 작동시킬 수 있습니까? 아니면 내 게임과 개념적으로 호환되지 않습니까?

    클라이언트의 POV로부터 엔티티의 이동이 결정적이지 않으면 Gambetta의 알고리즘이 작동하지 않습니다. 예를 들어 물리 나 다른 플레이어의 입력없이 개체에 영향을 줄 수있는 경우보다 용감한 접근이 필요합니다.

  • 단계에 대한 점진적 보간이 올바른 방법이됩니까? 그렇다면 서버에서받은 것과 일치하도록 클라이언트 위치에서 이미 움직이는 객체를 어떻게 보간합니까?

    이것은 서버 업데이트의 클라이언트 조정 인 다른 주제를 다룹니다. 점진적 보간법 은 효과가 있지만 문제의 것과 같은 매우 빠른 속도의 게임에서는 실제로 외삽 법을 구현하는 것이 좋습니다

  • 이러한 방법, 점진적 보간 및 Gambetta의 알고리즘이 함께 작동 할 수 있습니까? 아니면 상호 배타적입니까?

    엔티티 이동이 클라이언트 POV에서 결정적인 경우에만 함께 작동 할 수 있습니다. 따라서 엔티티가 삽입, 드래그 등과 같은 물리 또는 유사 물리에 의해 영향을받는 경우 작동하지 않습니다. '


1

시간 단계 측면에서 생각하기에는 게임이 너무 "실시간"인 것 같습니다. 게임이 "턴 기반"으로 간주 될 수있는 경우에만 "턴"으로 생각합니다. 그렇지 않으면 회전이나 발걸음을 버립니다. 그러면 모든 것이 쉬워집니다 :)

플레이어에 대해 로컬에서 예측하고 다른 엔터티에 대해서만 보간합니다 (시리즈의 세 번째 기사에서 설명 함). 이미 이동하고있는 객체에 대한 서버 업데이트를 처리하는 방법은 서버 쪽 조정이며, 두 번째 기사 (하단 링크) 하단에 설명되어 있습니다.

도움이 되었기를 바랍니다 :)


명확히하기 위해- "단계"라는 말은 "프레임"을 의미하며 초당 60 회 실행됩니다. 실제 게임 진행을 렌더링과 구별하기 위해이를 단계 (및 프레임 아님)라고하며 이상적으로는 초당 60으로 동기화됩니다. 이미 작동하는 서버 측 조정 버전을 이미 구현했습니다. 이 질문은 플레이어 명령과 관계없이 플레이어 명령과 관계없이 끊임없이 움직이고있는 플레이어 우주선에만 해당됩니다. 그것이 나의 어려움이있는 곳이다. 그것에 대한 생각? :)
OpherV 2016 년

프레임은 단계와 다릅니다. 단계는 예측 가능한 일정한 순서로 이동합니다. 프레임은 가변 시간만큼 이동하므로 진행률에 해당 프레임의 델타 시간을 곱해야합니다.
Tealr

@Tealr는 실제로 "step"이라는 용어를 사용하여 시작한 이유입니다. "step"의 사용이 턴제 게임에만 국한되지 않고 내 게임에서 한 걸음이 정확히 걸리는 것을 분명히하고 싶었습니다. 렌더링에 관계없이 초당 60 분의 1
OpherV

내가 실험 할 때주의해야 할 점은 1/60 초입니다. 비정상적으로 빠르며 1x1 이상의 참여율을 가진 대부분의 온라인 게임은 1/10 초에 작동합니다. 업데이트 또는 관련 정보.
Patrick Hughes
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.