Vật lý không đồng bộ hóa chính xác qua mạng khi sử dụng Bullet


11

Tôi đang cố gắng triển khai hệ thống vật lý máy khách / máy chủ bằng Bullet tuy nhiên tôi gặp vấn đề khi phải đồng bộ hóa mọi thứ.

Tôi đã thực hiện trạng thái chuyển động tùy chỉnh để đọc và viết biến đổi từ các đối tượng trò chơi của mình và nó hoạt động cục bộ nhưng tôi đã thử hai cách tiếp cận khác nhau cho các trò chơi nối mạng:

  1. Các đối tượng động trên máy khách cũng trên máy chủ (ví dụ: các mảnh vụn ngẫu nhiên và các thứ không quan trọng khác) được tạo thành động học. Điều này hoạt động chính xác nhưng các đối tượng không di chuyển rất trơn tru
  2. Các đối tượng là động trên cả hai nhưng sau mỗi thông báo từ máy chủ mà đối tượng đã di chuyển, tôi đặt tốc độ tuyến tính và góc tới các giá trị từ máy chủ và gọi btRigidBody :: processToTransform với biến đổi trên máy chủ. Tôi cũng gọi btCollisionObject :: activ (true); để buộc đối tượng cập nhật.

Ý định của tôi với phương pháp 2 về cơ bản là thực hiện phương pháp 1 nhưng chiếm quyền điều khiển Bullet để thực hiện dự đoán của một người nghèo thay vì tự mình làm theo phương pháp 1, nhưng điều này dường như không hiệu quả (vì những lý do không rõ ràng 100% với tôi thậm chí bước qua Bullet) và các đối tượng đôi khi kết thúc ở những nơi khác nhau.

Tôi đang đi đúng hướng? Bullet dường như được tích hợp mã nội suy. Điều đó có thể giúp tôi làm cho phương pháp 1 hoạt động tốt hơn không? Hoặc là mã 2 phương thức của tôi không hoạt động vì tôi vô tình dậm chân đó?

EDIT: Một vấn đề khác với phương pháp 1 Tôi chỉ nhận thấy là phản ứng va chạm sẽ không còn cho các va chạm với các đối tượng không được đồng bộ hóa. Cơ thể Kinetic loại công cụ bắn đến vô cùng đôi khi vì chúng không thể bị đánh bật trở lại.


Một vài điều có thể giúp bạn nhận được câu trả lời: Bạn đang sử dụng ngôn ngữ / công cụ nào? Đó là loại kết nối nào? Làm thế nào xấu là thâm hụt đồng bộ hóa, so với ping đến máy chủ?
Fibericon

2
Tùy chọn thứ hai không hoạt động vì bạn chỉ đặt vận tốc cho các giá trị máy chủ sau một vài khung để giữa mỗi gói có một vài khung mà mọi thứ có thể trôi. Tôi khuyên bạn nên đọc tất cả các bài đăng của Gaffer về vật lý trò chơi, trước tiên bạn có thể nên đọc 'sửa dấu thời gian của bạn' nhưng đây là bài viết cuối cùng nói về gafferongames.com/game-physics/networked-physics
Roy T.

Tôi đang sử dụng một công cụ tự phát triển trong C ++. Tuy nhiên, tôi khá chắc chắn rằng thâm hụt đồng bộ hóa không tệ lắm, có thể là 1 khung hình trên ping nếu tôi phải đoán nhưng tôi vẫn chỉ thực hiện kiểm tra LAN. Tôi sẽ kiểm tra những bài báo đó và vâng bạn đúng là vận tốc đã tắt. Tuy nhiên mọi thứ là cách tắt, giống như thùng là trên bản đồ. Không nên thiết lập rõ ràng việc biến đổi làm cho mọi thứ nói chung phù hợp cuối cùng? (ngay cả khi nó chưa đẹp, cười khúc khích, v.v.)
Lucas

Tôi đã đọc bài đăng của Gaffer và nó có nhiều thông tin nhưng dường như nó chủ yếu liên quan đến chuyển động của người chơi, đó là điều mà tôi đã làm việc. Tôi đã đọc xung quanh và có vẻ như mã phương thức 2 của tôi thực tế giống hệt với phương thức được sử dụng trong công cụ Unreal . Họ không cung cấp nhiều chi tiết nhưng điều đó khiến tôi tự hỏi liệu ý tưởng đó có hợp lý hay không nhưng việc sử dụng Bullet của tôi không chính xác.
Lucas

Một bài đọc thú vị, một phần liên quan đến chủ đề của bạn: gamasutra.com/view/feature/3094/iêu . Đó là về một rts và không phải về vật lý, nhưng họ đi đến điểm, nơi họ phải đồng bộ hóa một mô phỏng trên máy chủ và máy khách. Cách họ làm điều đó? Họ chạy các mô phỏng độc lập trên cả máy khách và máy chủ, nhưng máy chủ sẽ gửi các gói đảm bảo rằng mô phỏng máy khách không phân kỳ và được sửa chữa, nếu điều đó xảy ra ...
tom van green

Câu trả lời:


4

Bạn cần dự đoán phía khách hàng thích hợp .

Bạn thực sự nên đọc chi tiết liên kết Roy T. cung cấp cho bạn trong bình luận của anh ấy . Nó mô tả những gì cần làm với đầu vào và vật lý nhân vật của người chơi, nhưng nguyên tắc vẫn giữ nguyên cho "vật lý điều khiển máy chủ".

Điều này không tầm thường để thực hiện nhưng trong một vài từ, đối với các đối tượng trò chơi cần được đồng bộ hóa:

  • Chạy vật lý trên cả máy chủ và máy khách;
  • Máy chủ gửi cập nhật thường xuyên;
  • Máy khách liên tục & điều chỉnh lại một cách trơn tru thế giới vật lý của nó với các giá trị máy chủ.

Vì vậy, có, bạn đang đi đúng hướng với phương pháp của mình 2. Chỉ cần ghi đè các giá trị là không đủ, bạn sẽ có được các bước nhảy trên máy khách, điều bạn cần làm là trơn tru & liên tục nội suy các giá trị máy chủ.

Đối với lỗi thực tế của bạn, tôi không quen với Bullet, nhưng có lẽ bạn đang thiếu một số giá trị, ví dụ: bạn đã đặt vận tốc tuyến tính và góc, nhưng bạn đã đặt gia tốc chưa?


Cảm ơn! Điều này làm cho tôi cảm thấy tốt hơn rằng tôi đang đi đúng hướng. Bây giờ tôi sẽ kiểm tra mã của tôi với một chiếc lược răng tốt. Có thể một số thông báo sẽ không bị hủy hoặc như bạn nói tôi đang thiếu một giá trị vì phương thức 2 nên (giật) hoạt động.
Lucas

3

Những gì tôi làm cá nhân là bất cứ ai đang tổ chức trò chơi sẽ tạo ra thế giới tâm lý và đồng bộ hóa các đối tượng với khách hàng. Ngay cả khi sơ đồ mạng p2p, tôi vẫn dựa trên cơ sở vật lý của một trong những khách hàng của người chơi.

Vật lý khác mà tôi sử dụng đó hoàn toàn là kẹo mắt thậm chí không cần phải đồng bộ hóa.

Trong một nguyên mẫu mà tôi đã thực hiện một thời gian trước có tên là "nồi hơi", tôi đã chạy vật lý trên máy chủ và các hiệu ứng hạt (cũng sử dụng vật lý) không được đồng bộ hóa qua mạng mà độc lập cho mỗi khách hàng vì chúng là kẹo mắt.


Cảm ơn, vâng đó là một cách để đi về nó. Tuy nhiên, điều đó không dẫn đến phản ứng va chạm tốt trên máy khách đối với những thứ mà khách hàng làm và cả những thứ kẹo mắt sẽ không luôn tương tác chính xác vì nó không thể đẩy lùi những thứ trên máy chủ (ít nhất là trong dấu thời gian đó). Tôi cảm thấy như điều này phải có thể vì các công cụ như Unreal và Source dường như làm điều đó.
Lucas

kẹo mắt không cần phải đồng bộ hóa, nó có thể được tính theo từng khách hàng. Phản hồi trên máy khách được tính toán trên máy chủ, tọa độ của máy khách chỉ được tính toán và gửi lại, bạn không gửi lại cuộc gọi cho khách hàng nói rằng nó bị va chạm, điều đó có thể trông rất khủng khiếp.
tsturzl

2

Không thể thực hiện các thế giới vật lý đồng bộ mạng. Sự khác biệt nhỏ ở bước N Tất nhiên sự khác biệt lớn hơn nhiều ở bước N + 1 Bạn không thể áp dụng các lực hoặc xung để giữ cho nó đồng bộ hóa và trông thực tế.

Các giải pháp:-

  1. Bạn có thể xem xét để chỉ đồng bộ một vài đối tượng như nhân vật hoặc xe đua đặc biệt nếu chúng là động học. Nhưng hầu hết các phần của thế giới sẽ không đồng bộ để trông thực tế.

  2. Bạn có thể có một thế giới vật lý trên máy chủ và phát các vị trí và vận tốc của đối tượng cho khách hàng.


Bạn có thể thử chơi một số trò chơi mạng với vật lý để thấy rằng thế giới không đồng bộ. ví dụ Need For Speed ​​World là miễn phí và có nhiều người chơi và vật lý cơ bản. (hộp trên đường và các vật thể phá hủy)
Tối đa

Tôi không chắc chắn tôi theo bạn chính xác. Tôi khá chắc chắn điều này là có thể vì nhiều trò chơi cho phép người chơi ném thùng xung quanh (ví dụ). Có vẻ như tùy chọn 2 của bạn tương tự như tùy chọn 2 của tôi, nhưng tôi không thể khiến Bullet có thể chụp các đối tượng vào vị trí máy chủ của họ một cách sạch sẽ. Có lẽ đó là vấn đề gốc rễ của tôi?
Lucas

1
Không. Thông thường đó là ảo tưởng về sự đồng bộ. Nếu bạn so sánh các màn hình thì bạn sẽ thấy rằng khi bạn nảy trong các hộp thì các hộp sẽ bay theo các hướng khác nhau. hoặc hộp hoàn toàn không phải là vật lý (chỉ là hình ảnh động ed). Số lượng hộp là khác nhau. Khi tôi nói hoạt hình tôi có nghĩa là không có hoạt hình vật lý đằng sau các phong trào. Họ không có nhiều thủ thuật khác nhau làm cho hình ảnh trông hơi đồng bộ nhưng đó không phải là thế giới vật lý đồng bộ. Bạn nên xem và so sánh cách chúng di chuyển trong các trò chơi khác nhau.
Tối đa
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.