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.