멀티 플레이어에서 점프와 같은 동작을 동기화하는 방법은 무엇입니까?


11

저는 초보자 게임 개발자이며 멀티 플레이어 게임에 대해 연구하고 있습니다. 나는 항상 약간의 대기 시간이 있음을 관찰했으며 플레이어는 항상 과거 작업에서 업데이트를 얻습니다. 그러나 대기 시간을 처리하기위한 데드 레커닝과 같은 기술이 있습니다. 움직임을 예측하고 부드럽게 움직일 수 있습니다. 그러나 점프, 걷기 중지 등과 같은 동작을 어떻게 동기화합니까?

클라이언트 A가 움직이고 있고 100m / sec 속도로 10.2 시간에 100m에 있고이 정보를 보냈다고 가정하십시오. 클라이언트 B는이 정보를 다소 나중에받습니다. 10.4로 설정하십시오. 따라서 클라이언트 B에서 예측을 사용하고 클라이언트 A를 120m에 배치 할 수 있습니다. 그러나 고객이 10.3에서 110m로 점프하면 어떻게 될까요? 나는 그것을 예측할 수 없으며 예측을 사용했기 때문에 과거에 클라이언트 A 점프를 보여줄 수 없습니다.

점프 동작을 전혀 보내지 않으면 서이 문제를 해결할 수 있습니다. 그러나 내 게임에 플레이어가 넘어져 죽을 수있는 빈 공간이 있다면 어떨까요? 따라서 점프 동작을 동기화하지 않으면 다른 플레이어는 한 명의 플레이어가 실행 중임을 확인한 다음 공허에 빠지고 다시 화면에 나타나 시각적 참여를 방해합니다.

점프는 단지 예일 뿐이며 예측이 작동하지 않는 많은 시나리오가있을 수 있습니다. 그래서 어떻게 처리합니까? 그러한 예 중 하나는 Awesomenauts와 같은 멀티 플레이어 온라인 배틀 경기장 게임 일 수 있습니다.


멀티 플레이어에 대해 잘 모르므로 적절한 답변을 드릴 수 없습니다. 그러나 내가 선택한 것에서 이상적인 설정은 클라이언트가 다소 바보이며 키보드, 마우스, 게임 패드 또는 입력을 서버에 보내면 서버는 모든 움직임과 세계를 업데이트하고 위치 및 기타 모든 관련 데이터를 클라이언트로 다시 전송 한 다음 결과를 표시합니다. 이 모든 것은 예측과 비슷한 것을 제거합니다.
Christian

@ 크리스찬 헤이! 답장을 보내 주셔서 감사합니다. 이 방법에 대해 알고 있지만 지연 시간이 길고 AppWarp의 BaaS 실시간 시스템을 사용하는 경우 게임 플레이가 원활하지 않을 수 있으므로 모든 논리는 클라이언트 측에만 있습니다.
Suyash Mohan

두 가지 방법을 결합하는 것이 권위있는 서버입니다. 클라이언트와 서버는 모두 시뮬레이션하고 클라이언트는 입력을 보내며 서버는 권한있는 상태를 다시 보냅니다. 클라이언트는 권한 상태와 일치하도록 상태를 조정합니다. 따라서 상태가 일치하면 클라이언트는 로컬에서 시뮬레이트되는 것처럼 지연없이 실행됩니다.
MichaelHouse

최근에이 튜토리얼 시리즈에서 지연 시간 관리에 대한 유용한 팁을 얻을 수있었습니다. 관심 분야와 관련이있는 것 같습니다. link
Kris Welsh

답변:


8

이 경우 데드 레커닝이 최선의 아이디어가 아닐 수도 있습니다. 엔티티 보간을 수행해야합니다 (과거에 다른 플레이어를 효과적으로 렌더링하여 항상 실제 위치를 제공합니다). 나는 이것에 대해 훨씬 더 자세히 여기에 썼다 . 과거에 플레이어를 약간 볼 수 있는지 여부는 수행하려는 작업의 세부 사항에 따라 다릅니다.


4
첫 네트워크 멀티 플레이어 게임을 작성할 때이 방법을 사용했습니다. 사실 @ggambett를 참조로 사용했습니다. 그것은 나를 위해 잘 작동했습니다.
NoobsArePeople2

1

소스 엔진과 관련하여 상당히 자세한 내용이 있습니다. 관련 소스 코드 중 일부가 소스 SDK의 일부로도 제공되는 것으로 보입니다.

https://developer.valvesoftware.com/wiki/Source_Multiplayer_Networking

서버-클라이언트 모델에서 네트워크 대기 시간을 처리하기 위해 여러 가지 기술을 사용합니다. 요점은 로컬 클라이언트가 서버가없는 것처럼 입력 및 기타 이벤트를 로컬로 처리 한 다음 서버가 나중에 클라이언트가 잘못했다고 말할 가능성을 다루는 것 같습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.