Bullet을 사용할 때 네트워크에서 물리가 올바르게 동기화되지 않음


11

Bullet을 사용하여 클라이언트 / 서버 물리 시스템을 구현하려고하는데 동기화하는 데 문제가 있습니다.

게임 오브젝트에서 변형을 읽고 쓰는 커스텀 모션 상태를 구현했으며 로컬에서 작동하지만 네트워크 게임에 대해 두 가지 다른 접근법을 시도했습니다.

  1. 서버에도있는 클라이언트의 동적 객체 (예 : 임의의 잔해 및 기타 중요하지 않은 물건)는 운동 학적으로 만들어집니다. 이것은 올바르게 작동하지만 개체가 매우 부드럽게 움직이지 않습니다.
  2. 객체는 둘 다 동적이지만 객체가 이동했다는 서버의 각 메시지 후에 선형 및 각 속도를 서버의 값으로 설정하고 서버에서 변환하여 btRigidBody :: proceedToTransform을 호출합니다. 또한 btCollisionObject :: activate (true); 개체를 강제로 업데이트합니다.

방법 2에 대한 나의 의도는 기본적으로 방법 1을 수행하지만 Bullet 1을 납치하여 방법 1을 매끄럽게하는 대신 가난한 사람의 예측을 수행하는 것이었지만 작동하지 않는 것 같습니다 (100 % 명확하지 않은 이유로) 나조차도 Bullet을 밟고) 때로는 물건이 다른 곳에서 나옵니다.

올바른 방향으로 가고 있습니까? 글 머리 기호에 자체 보간 코드가 내장되어있는 것 같습니다. 방법 1을 개선하는 데 도움이 될 수 있습니까? 또는 실수로 실수로 스톰 핑했기 때문에 내 방법 2 코드가 작동하지 않습니까?

편집 : 방금 주목 한 방법 1의 또 다른 문제는 동기화되지 않은 객체와의 충돌에 대한 충돌 응답이 중단된다는 것입니다. 키네틱 바디는 노크 할 수 없기 때문에 때때로 촬영물을 무한대로 촬영합니다.


답변을 얻는 데 도움이되는 몇 가지 사항 : 어떤 언어 / 엔진을 사용하고 있습니까? 어떤 유형의 연결입니까? 서버에 대한 핑 (ping)과 비교하여 동기화 결함이 얼마나 나쁜가?
Fibericon

2
두 번째 옵션은 몇 프레임 후에 서버 속도로만 속도를 설정하므로 각 패킷 간에는 표류 할 수있는 몇 개의 프레임이 있기 때문에 작동하지 않습니다. 게임 물리학에 대한 모든 Gaffer의 게시물을 읽는 것이 좋습니다. 먼저 '시간 단계 수정'을 읽어야하지만 네트워크 물리학에 관한 마지막 기사는 gafferongames.com/game-physics/networked-physics
Roy T.

C ++에서 자체 개발 엔진을 사용하고 있습니다. 그러나 나는 동기화 결손이 그렇게 나쁘지 않다고 확신합니다. 추측해야한다면 1 프레임 오버 핑일 것입니다.하지만 여전히 LAN 테스트 만하고 있습니다. 나는 그 기사를 확인하고 네, 속도가 꺼져있는 것이 맞습니다. 그러나 사물은 방법 크레이트는지도를 통해처럼, 끕니다. 변환 make를 명시 적으로 설정하면 일반적으로 결국 준수해야합니까? (아직 예쁘지 않은 경우에도 흔들림 등)
Lucas

나는 Gaffer의 게시물을 읽었으며 유익한 정보를 얻었지만 대부분 플레이어 동작을 처리하는 것처럼 보였습니다. 나는 주위를 읽고 있었고 내 방법 2 코드는 실제로 Unreal 엔진에 사용 된 방법과 동일한 것 같습니다 . 그것들은 많은 세부 사항을 제공하지는 않지만 아이디어가 올바른지 궁금하지만 Bullet 사용이 잘못되었습니다.
Lucas

흥미로운 주제는 gamasutra.com/view/feature/3094/… 주제와 관련이 있습니다 . 그것은 rts에 관한 것이지 물리에 관한 것이 아니라 서버와 클라이언트에서 시뮬레이션을 동기화 해야하는 시점에 도달합니다. 그들이하는 방법? 그들은 클라이언트와 서버 모두에서 독립적 인 시뮬레이션을 실행하지만, 서버는 클라이언트 시뮬레이션이 분기되지 않고 발생하는 경우 수정되도록 패키지를 전송합니다.
tom van green

답변:


4

적절한 클라이언트 측 예측 이 필요합니다 .

Roy T.가 자신의 의견에서 제공 한 링크 를 자세히 읽어야 합니다. 플레이어 입력 및 캐릭터 물리로해야 할 일을 설명하지만 원칙은 "서버 중심 물리학"에서 동일하게 유지됩니다.

이것은 구현하기가 쉽지 않지만 몇 마디로 동기화 해야하는 게임 개체에 대해서는 다음과 같습니다.

  • 서버와 클라이언트 모두에서 물리를 실행하십시오.
  • 서버는 정기적으로 업데이트를 보냅니다.
  • 클라이언트는 물리 세계를 서버 값으로 지속적으로 부드럽게 다시 조정합니다.

따라서 예, 방법 2를 사용하여 올바른 방향으로 나아가고 있습니다. 값을 재정의하는 것만으로는 충분하지 않습니다. 클라이언트에서 뛰어 넘을 수 있습니다. 서버 값에 매끄럽고 지속적으로 보간해야합니다.

실제 버그의 경우 Bullet에 익숙하지 않지만 선형 및 각 속도를 설정했지만 가속을 설정 한 값이 누락되었을 수 있습니다.


감사! 이것은 내가 올바른 길을 가고 있다는 느낌을 더 좋게 만듭니다. 이제 좋은 치아 빗으로 코드를 살펴 보겠습니다. 어쩌면 일부 알림이 시작되지 않거나 방법 2가 작동해야하기 때문에 값이 누락되었다고 말할 수 있습니다.
Lucas

3

내가 개인적으로하는 일은 게임을 주최하는 사람이 물리 세계를 만들고 클라이언트와 객체를 동기화하는 것입니다. p2p 네트워크 체계 라하더라도 여전히 물리 엔진을 플레이어 클라이언트 중 하나를 기반으로합니다.

내가 사용하는 다른 물리학은 순전히 안구 사탕 일 필요도 없습니다.

"boilerzerker"라고 불리는 프로토 타입에서 호스트에서 물리를 실행했으며 파티클 ​​효과 (물리를 사용하는)는 네트워크를 통해 동기화되지 않았지만 각 클라이언트에 대해 눈 사탕이기 때문에 독립적이었습니다.


고마워, 그래, 한 가지 방법이야. 그러나 그것은 클라이언트가 클라이언트가하는 일에 대해 좋은 충돌 응답을 일으키지 않으며 눈 사탕은 서버 일을 (적어도 그 시간 단계 내에서) 뒤로 밀 수 없기 때문에 항상 올바르게 상호 작용하지는 않습니다. 언리얼이나 소스 같은 엔진이 그렇게하기 때문에 이것이 가능해야한다고 생각합니다.
Lucas

눈 사탕은 동기화 할 필요가 없으며 클라이언트별로 계산할 수 있습니다. 클라이언트의 응답이 서버에서 계산되고 클라이언트의 좌표가 방금 계산되어 다시 전송됩니다. 클라이언트가 충돌했다는 콜백을 보내지 않으면 아마도 끔찍할 것입니다.
tsturzl

2

네트워크 동기 물리 세계를 구현하는 것은 불가능합니다. N 단계의 작은 차이 코스 N + 1의 훨씬 더 큰 차이 동기화 및 현실감을 유지하기 위해 힘이나 충격을 가할 수 없습니다.

솔루션 :-

  1. 특히 운동 학적 인 경우 캐릭터 또는 경주 용 자동차와 같은 일부 객체 만 동기화하는 것을 고려할 수 있습니다. 그러나 세계의 대부분은 현실적으로 보이도록 동기화되어 있지 않습니다.

  2. 서버에 하나의 물리 세계가 있고 클라이언트에 객체 위치 및 속도를 브로드 캐스트 할 수 있습니다.


물리가있는 네트워크 게임을 통해 세계가 동기화되지 않았 음을 확인할 수 있습니다. 예를 들어 Need For Speed ​​World는 무료이며 멀티 플레이어 및 기본 물리학이 있습니다. (도로상의 상자와 파괴 가능한 물체)
Max

나는 당신을 정확하게 따르고 있는지 확실하지 않습니다. 많은 게임에서 플레이어가 상자를 던질 수 있기 때문에 이것이 가능할 것입니다. 옵션 2가 옵션 2와 비슷한 것 같지만 Bullet이 객체를 서버 위치에 깔끔하게 스냅 할 수는 없습니다. 그게 내 근본 문제 일까?
Lucas

1
아닙니다. 보통 동기의 환영입니다. 화면을 비교하면 상자를 튕기면 상자가 다른 방향으로 날아가는 것을 볼 수 있습니다. 또는 상자는 전혀 물리가 아닙니다 (단지 애니메이션). 상자의 수가 다릅니다. 애니메이션을 말할 때 움직임 뒤에 물리 애니메이션이 없다는 것을 의미합니다. 그것들은 다양한 트릭을 갖지 않아 그림이 다소 동기화되어 보이지만 동기식 물리 세계는 아닙니다. 다른 게임에서 어떻게 움직이는 지보고 비교해야합니다.
최대
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.