클라이언트 측 예측으로 실시간 무작위 이동을 처리하는 방법


10

클라이언트와 서버에서 동일한 '물리'루프를 실행하는 실시간 멀티 플레이어 게임을 만들고 있습니다. 나는 본질적인 무작위 움직임 인 조향 행동 '방황'을 사용하고 있습니다. 방황 알고리즘을 실행할 때 클라이언트와 서버가 다른 난수를 생성합니다.

나는 자연스럽게 무작위로 보이는 움직임을 유지할 수있는 방법을 궁금하지만 클라이언트와 서버가 같은 결론을 얻도록 일정한 것을 사용합니다.


4
의사 난수 시퀀스에서 동일한 난수 시퀀스를 생성하는 것은 쉽습니다. 어려운 것은 그 순서의 사용을 동기화하는 것입니다. 임의 순서를 사용하지 않고 결정적인 방식으로 임의 순서를 사용한다는 의미에서 게임 논리를 결정 론적으로 만들어야합니다. 이것을 달성하는 가장 쉬운 방법은 일반적으로 게임 로직 루프에서 동시성을 피하는 것이지만, PRNG에 임의의 값을 요청할 때 스레드가 PRNG의 타이밍 및 순서에 의존하지 않는 한 동시성을 가질 수 있습니다. 여기 용이 되십시오.
Lie Ryan

답변:


14

랜덤 시드 를 사용할 수 있습니다 . 서버와 클라이언트에서 동일한 32 비트 값을 선택하십시오 (또는 서버가 시작할 때 클라이언트로 값을 보낼 수 있음). 랜덤 제너레이터의 시드로 사용하십시오. 게임 상태 업데이트를 통해 서버에서 클라이언트로 실제 시드를 보낼 수 있습니다. 보내지 않으려면 클라이언트와 서버가이 난수 생성기에 의해 동일한 수의 난수를 생성해야합니다.

클라이언트에게 실제 시드를 보내지 않기로 결정하기 전에 알아야 할 사항 :

  • 클라이언트에서 캐릭터 컬링에 문제가있을 수 있습니다 (클라이언트와의 전쟁에서 깊이있는 캐릭터를 처리하지 않음을 의미합니다). 캐릭터 컬링을 원한다면 클라이언트가 캐릭터를 처리해야 할 때 서버에서 클라이언트로 모든 캐릭터 상태 (실제 시드 포함)를 보냅니다. 따라서 서버는 클라이언트가 언제 문자를 처리해야하는지, 그렇지 않아야하는지 결정해야합니다. 각 문자마다 별도의 무작위 생성기를 사용해야합니다.
  • AI 롯드에서도 같은 문제가 발생합니다.
  • 이 랜덤 생성기의 난수는 고정 시간 델타로 업데이트 할 때만 생성해야합니다. 렌더링 전에 AI 보간에 임의의 숫자를 사용하려면 별도의 임의 생성기를 사용해야합니다 (서버에는 렌더링이 없으므로 사용할 시드는 신경 쓰지 마십시오).
  • 클라이언트 및 서버 (예 : C ++ 및 Java)에 서로 다른 플랫폼을 사용하려면 크로스 플랫폼 랜덤 생성기를 구현 (또는 찾기)해야합니다. 랜덤 생성기는 구현하기 쉽기 때문에 큰 문제는 아닙니다.

3

서버와 클라이언트 모두 시드에 동의하면 대부분의 무작위 알고리즘이 동일한 값을 출력합니다.

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