(Unity) Giải pháp mạng được tối ưu hóa cho nhiều đối tượng chuyển động


8

Tôi hiện đang thực hiện một dự án khá tham vọng. Nói tóm lại, đây là một game chiến thuật nhiều người chơi thời gian thực có cơ chế vi khuẩn.

Về cơ bản, tôi có hai người chơi từ xa trong môi trường và họ có thể sinh ra các đơn vị giống như vi khuẩn tấn công lẫn nhau và nhân lên, tự nhân đôi cho đến khi giới hạn tài nguyên bị tấn công. Điều này thường dẫn đến khoảng hơn 200 đối tượng trò chơi được hiển thị trên màn hình, mỗi đối tượng có trạng thái và chuyển động riêng. Điều này nghe có vẻ tệ, nhưng lối chơi cục bộ chống lại bot thực sự rất tốt và tôi đã xoay sở để làm cho nó khá hiệu quả.

Tuy nhiên, vấn đề phát sinh khi tôi cố gắng nối mạng trò chơi này. Tôi đã cố gắng làm theo hướng dẫn này để triển khai tính năng này: http://www.paladinstudios.com/2013/07/10/how-to-create-an-online-multiplayer-game-with-unity/

Điều này tạo ra một trải nghiệm trò chơi khá chậm, khó chịu ngay cả với độ trễ tốt nhất. Điều này có thể xảy ra do phải truyền dữ liệu chuyển động cho hàng trăm đơn vị.

Câu hỏi tôi đang đặt ra:

Làm cách nào tôi có thể tối ưu hóa kết nối mạng và đồng bộ hóa của nhiều đơn vị di chuyển giữa hai khách hàng?

Tôi đã nghĩ ra một cách để làm điều này. Sau khi sinh ra một đơn vị, chúng sẽ chỉ đi theo một hướng cho đến khi chúng chạm phải thứ gì đó - có lẽ tôi chỉ có thể đồng bộ hóa khi các đơn vị được sinh ra và khi chúng tương tác với một đối tượng khác? Điều này sẽ có nhiều lợi ích? Cách lý tưởng để thực hiện điều này là gì?

Cảm ơn trước phản hồi!


Là một mô hình lockstep có thể là những gì tôi cần? clintonbrennan.com/2013/12/lockstep-imcellenceation-in-unity3d
Rachel Cabot

Tôi đứng sau một tường lửa và không thể truy cập vào ví dụ bạn đã liên kết, nhưng bạn đã thử tuần tự hóa chỉ các ID đối tượng, vị trí và vectơ vận tốc trên mỗi khung chưa? Tùy thuộc vào mức độ thông minh mà bạn có được với thuật toán tuần tự hóa, bạn có thể giảm thông tin trạng thái xuống còn 7 byte cho mỗi đối tượng. Nếu bạn đảm bảo rằng máy khách giả sử một ID bị thiếu trong bản cập nhật là một cái chết và những cái mới là một sinh sản, bạn sẽ không gặp vấn đề gì.
Stephan

Câu trả lời:


1

Đối với hơn 200 đối tượng chuyển động, bạn chắc chắn sẽ muốn thực hiện bước khóa trò chơi của mình. Với bước chân, cần phải có tính xác định nhưng điều đó không quá khó đối với vi khuẩn (có thể được mô phỏng với các va chạm vòng tròn).

Nếu bạn không quan tâm đến việc tự cắm không biết xấu hổ của tôi và muốn có một ví dụ với logic kết nối và mô phỏng của trò chơi khóa, hãy xem tài sản này miễn phí: https://www.assetstore.unity3d.com/en/#!/ nội dung / 36206 . Thật không may, phiên bản đó không bao gồm tất cả các mã nguồn nhưng hãy thoải mái hack nó với sự phù hộ của tôi;). Đây là video về một thử nghiệm ban đầu của DPhysics: https://www.youtube.com/watch?v=NEzOghxfMdU .

Ý chính của lockstep là đồng bộ hóa đầu vào thay vì đầu ra. Điều này là do với một mô phỏng đồng bộ, điều duy nhất mà tất cả các khách hàng không biết là đầu vào của các khách hàng khác. Bài viết bạn liên kết trong bình luận của bạn giải thích nó khá tốt. Tôi không chắc bạn muốn tôi giải thích sâu đến mức nào, vì vậy tôi sẽ cắt nó ở đây và mở rộng câu trả lời này nếu bạn có thêm bất kỳ câu hỏi nào.

Cập nhật: Hãy nghĩ về nó như một máy chủ có thẩm quyền, ngoại trừ máy chủ gửi đầu vào thay vì trạng thái trò chơi. Vì mọi người chơi có thể tự tạo trạng thái trò chơi từ đầu vào, nên không cần máy chủ phân phối trò chơi.


1
Cách tiếp cận này có khả năng dẫn đến mất đồng bộ hóa, ngay cả khi mọi thứ đều mang tính quyết định, chỉ vì độ trễ giữa các đầu vào được chia sẻ. Ví dụ, lấy một trò chơi trong đó người chơi cố gắng chặn chuyển động của một vật thể bằng cách đặt các bức tường. Trên màn hình của một người chơi, anh ta có thể đã hẹn giờ chính xác vị trí và đối tượng bị chặn. Nhưng việc sao chép điều đó cho khách hàng khác có thể đến muộn và khi bức tường được đặt, đối tượng đã vượt qua vị trí đó. Tùy thuộc vào cơ chế trò chơi của bạn, bạn có thể vẫn cần định kỳ gửi các bản cập nhật "bức tranh lớn" để đồng bộ hóa lại máy khách.
Acidictadpole

Điểm tốt. Có 0 khả năng khử nhiễu nếu điều này được thực hiện chính xác. Nếu một gói bị bỏ lỡ hoặc đến rất muộn, khách hàng không thể chuyển sang khung tiếp theo - anh ta sẽ phải đợi cho đến khi gói đến để thực hiện khung hiện tại. Khung có thể được đại diện với số nguyên. Máy chủ phân phối các gói được đánh dấu bằng một số nguyên cho mỗi khung.
JPtheK9

Kiểm tra mạng và khung logic cho chính mình.
JPtheK9

1
@ JPtheK9 "anh ấy sẽ phải đợi cho đến khi gói đến để thực thi khung hiện tại" Và nếu gói không bao giờ đến thì sao?
Stephan

Yêu cầu một cái mới.
JPtheK9
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.