Làm cách nào để sao chép mô phỏng Box2d, mô phỏng giữa?


7

Tôi muốn tuần tự hóa giữa trò chơi trạng thái, gửi nó qua mạng tới một máy tính giống hệt nhau (cùng CPU, cùng hệ điều hành, cùng nhị phân), tải nó ở đó và để hai trò chơi chạy song song cùng một mô phỏng, mà không cần một trong số họ trôi dạt và đi haywire.

Tóm lại: Tôi muốn hỗ trợ kết nối pop-in, pop-out trên trò chơi chuyên sâu vật lý CAO của tôi, trong đó việc gửi tọa độ đối tượng cứ sau vài giây là không thể, do có hàng ngàn đối tượng và nhiều khách hàng.

Tôi đã thử điều này với Box2D và lưu vị trí / vận tốc / vật thể của đối tượng là không đủ ... có trạng thái bên trong không thể truy cập được thông qua bất kỳ phương thức công khai nào.

Cách giải quyết hiện tại của tôi là buộc MỌI khách hàng lưu toàn bộ thế giới của mình và tải lại từ đầu, bất cứ khi nào một người chơi mới kết nối ... nhưng đây rõ ràng là một thực tiễn tồi, bởi vì nó treo trò chơi cho mọi người mỗi khi có người mới kết nối. Tuy nhiên, nó hoạt động, với sự không đồng bộ hóa bằng không.

Vì vậy, bất cứ ai biết bất kỳ kỹ thuật khác có thể giúp tôi? Hay tôi chỉ nên hôn tạm biệt dự án của mình?


2
Câu hỏi thú vị, nhưng yêu cầu một động cơ có lẽ lạc đề. Tôi sẽ viết lại từ đó để chỉ cần hỏi "làm thế nào để tôi sửa lỗi này?". Nếu một động cơ kết thúc trong câu trả lời, đó không phải là vấn đề.
John McDonald

1
Bạn sẽ không phải loại bỏ dự án, chỉ cần hỗ trợ pop-in. Có lẽ bạn có thể có trạm kiểm soát trên đường đi? Những nơi mà trò chơi sẽ tạm dừng để cho phép người chơi mới tham gia? Điều này ít nhất sẽ là một sự tạm dừng dự kiến. Liên quan: gamedev.stackexchange.com/questions/8619/... gamedev.stackexchange.com/questions/53887/... gamedev.stackexchange.com/questions/13789/...
MichaelHouse

Giới hạn thời gian khi người dùng có thể tham gia chắc chắn là một ý tưởng thú vị mà tôi chưa từng nghĩ đến ... và có lẽ tôi sẽ sử dụng nó để cải thiện cách giải quyết xấu xí của mình một chút. Nhưng một cách giải quyết xấu xí vẫn là một cách giải quyết xấu xí, bất kể bạn nheo mắt nhìn nó như thế nào.
Whyte

Tôi đã đến cùng một giải pháp với JBox2D. Tôi xây dựng lại thế giới từ đầu trên mỗi khách hàng khi một khách hàng mới tham gia và nó cũng hoạt động với tôi với mọi thứ được đồng bộ hóa. Cho đến nay tôi đã đẩy lo lắng về điều này trong tương lai nếu / khi nó trở thành một vấn đề, nhưng tôi rất vui vì bạn đã hỏi câu hỏi này. Xin lỗi tôi không giúp đỡ nhiều hơn!
Venesectrix

1
Đây là một ý tưởng: điều gì sẽ xảy ra nếu bạn xây dựng lại thế giới từ đầu trong một vài đối tượng tại một vòng lặp cập nhật. Sau đó, khi bạn sẵn sàng chuyển qua, bạn chơi bất kỳ lệnh nào xảy ra từ khi bắt đầu xây dựng lại cho đến bây giờ (để bắt bản dựng mới đến trạng thái hiện tại) và sau đó chuyển qua. Có thể bạn sẽ thấy một bước nhảy nhỏ từ phát lại các lệnh sang trạng thái vật lý hơi khác một chút nhưng nó không nên treo trò chơi trong khi bạn xây dựng lại thế giới ít nhất. Thậm chí điều đó có thể được giảm bớt với nội suy.
Venesectrix

Câu trả lời:


1

Tôi đã gặp phải vấn đề tương tự (đồng bộ hóa thế giới box2d cho các máy khách trình duyệt với thế giới trên máy chủ node.js) và giải pháp của tôi: đồng bộ hóa thế giới box2d đang hoạt động - không thể. Vì vậy, tôi đã cắt tất cả vật lý khỏi các máy khách, và bây giờ chúng đang nhận được các vị trí được đánh dấu thời gian riêng biệt của các đối tượng (và một số sự kiện) từ máy chủ (đang chạy box2d) và nội suy giữa chúng. Box2d sử dụng các giá trị được tạo ở các bước trước để tính bước nex, vì vậy bạn cần đi sâu vào bên dưới mui xe để làm cho box2d tương thích với mạng.


Đó là cách tiếp cận thông thường trong các trò chơi, và là cách tôi đã xem xét đầu tiên ... nhưng điều đó là không thể do số lượng lớn vật phẩm đang hoạt động thể chất và do mọi thứ diễn ra hoàn toàn khác nhau trong các mô phỏng của tôi (một vật thể sẽ nảy ra một hướng hoàn toàn khác trong chưa đầy 0,5 giây của lần đồng bộ hóa cuối cùng).
Whyte

1
Bạn có thể thử sử dụng tốc độ cập nhật dưới 0,5 giây không? Trong trường hợp của tôi, tốc độ cập nhật là 45 ms và nó hoạt động khá tốt thông qua websocket. Lượng lưu lượng mạng khổng lồ có thể được giảm bằng cách nén và chỉ truyền các vùng đồng bằng vị trí. Ngoài ra một số phần của vật lý có thể được thực hiện trên máy khách để phản ứng ngay lập tức cho đầu vào của người dùng hoặc một số phép nội suy nâng cao (phi tuyến tính) có thể được sử dụng.
Zuker

0

Chạy mô phỏng của bạn trên Máy chủ, gửi các cập nhật trạng thái đối tượng được đánh dấu thời gian của khách hàng (được nén theo tỷ lệ cố định), gửi các thông báo sự kiện trò chơi khác khi chúng xảy ra và để Khách hàng xử lý nội suy / ngoại suy giữa các cập nhật trạng thái mạng. Bạn không cần gửi thông tin cập nhật cho tất cả các đối tượng trong trò chơi tới tất cả khách hàng. Mô phỏng sự thất vọng của máy ảnh người chơi (3D) hoặc xem trực tiếp (2D) trên Máy chủ và chọn thuật toán phân vùng không gian ưa thích của bạn để xác định đối tượng nào khách hàng có thể nhìn thấy, chỉ gửi cập nhật cho những gì khách hàng có thể nhìn thấy. Điều này sẽ đặt thêm tải cho cpu máy chủ, nhưng sẽ giảm băng tần mạng trên máy chủ xuống mức hợp lý.

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.