kết nối nhiều người chơi với vật lý


12

Tôi tò mò về cách kết nối nhiều người chơi với vật lý trong các game đua xe. Chúng ta có một thế giới vật chất với nhiều phương tiện di chuyển nhanh được điều khiển bởi những người khác nhau. Giả sử các phương tiện có vũ khí và có thể bắn nhau (Twisted Metal, Vigilante v8)

Tôi lo lắng về các hit và va chạm. Máy chủ có thẩm quyền hoặc một sự thay thế tốt hơn?

Câu trả lời:


5

Thông thường, một Máy chủ được sử dụng, lưu trữ trạng thái "sự thật" được chia sẻ định kỳ với Khách hàng. Xung đột xảy ra độc lập trong Khách hàng và Máy chủ, với trạng thái của Khách hàng được ước tính từ các trạng thái trước đó bằng cách sử dụng quy trình tương tự như quy trình thường được gọi là Xác định chết . Khi trạng thái Máy chủ đến Máy khách, nếu có sự khác biệt, Máy khách thực hiện chuyển đổi từ trạng thái hiện tại sang trạng thái vừa nhận được chủ yếu thông qua phép nội suy.

Tuy nhiên, với nhiều va chạm đối tượng có thể là một vấn đề thực sự, do đó, điều thường được thực hiện là giữ thời gian mô phỏng của Khách hàng chậm hơn một chút so với thời gian mô phỏng của Máy chủ để cho phép mức độ linh hoạt bổ sung khác nhau. Bài viết này về mã nguồn Engine Engine của Valve khá hấp dẫn. Ngoài ra, nếu bạn vẫn chưa quyết định nên sử dụng thư viện / phần mềm trung gian mạng nào, tôi khuyên bạn nên xem xét RakNet và thành phần "ReplicaManager3" của nó .


2

Có một vài điều bạn có thể làm.

  1. Bạn có thể tập trung tất cả các đối tượng vật lý trên máy chủ và đồng bộ tọa độ với các đối tượng người chơi trên tất cả các máy khách. Đây là cách dễ nhất và hoạt động không có nhiều sai sót, tuy nhiên nó sử dụng nhiều tài nguyên và đòi hỏi nhiều băng thông. Bạn có thể tối ưu hóa việc sử dụng băng thông bằng cách chỉ gửi các giá trị cho trình phát của những người chơi khác trong bán kính nhất định.

  2. Bạn có thể làm như Neenster đã đề cập và có máy chủ và máy khách mô phỏng vật lý, thường thì máy chủ sẽ sửa máy khách. Điều này có nghĩa là tất cả các máy khách đều tính toán vật lý riêng cho mọi người chơi và bạn sẽ đồng bộ hóa các sự kiện nhấn phím trên máy chủ theo quỹ đạo của từng người chơi trên mỗi máy khách. Cứ sau 5 giây, máy chủ sẽ phát sóng mô phỏng vật lý và tất cả khách hàng chấp nhận thay đổi. Điều này có thể tạo ra những sự bù trừ nhỏ mà hầu như không thể nhận thấy được, nhưng trong thời gian trễ mạng và mất gói (không thể tránh khỏi với UDP lưu lượng truy cập cao), bạn sẽ nhận thấy trình phát của mình và / hoặc những người chơi khác đang lướt qua màn hình và thay đổi vị trí nhanh chóng từ?).

  3. Bạn có thể yêu cầu mỗi khách hàng tính toán vật lý của riêng mình và đồng bộ tọa độ của nó. Điều này gây khó khăn cho việc mô phỏng vật lý trên các đối tượng được chia sẻ giữa các máy khách. Đây là một khái niệm khá phức tạp để thực hiện nếu bạn muốn làm bất cứ điều gì hấp dẫn, bởi vì đối tượng nhất định không nhất thiết thuộc về bất kỳ khách hàng nào.

Đầu tiên có lẽ là dễ nhất và nên cho phép bạn có khoảng 4-5 người chơi với độ trễ nhỏ. Nó sẽ yêu cầu mỗi trận đấu phải có máy chủ riêng. Nếu bạn đang thực hiện LAN phù hợp thì đây là cách tốt nhất.

Thứ hai có lẽ là thực tế nhất, tuy nhiên nó có thể khó thực hiện. Nó cũng khá tài nguyên để chạy các mô phỏng vật lý trên máy chủ. Nếu bạn có máy chủ tập trung, có lẽ bạn cần tải cân bằng cho một số máy, có thể cho phép 10 máy chủ khớp với máy chủ, tải các trận đấu mới vào máy chủ có ít trận đấu nhất.

Thứ ba chắc chắn là ít căng thẳng nhất trên máy chủ và có lẽ là giải pháp tốt nhất nếu bạn đang thực hiện sơ đồ mạng ngang hàng. Như tôi đã đề cập, có thể khó đồng bộ hóa các đối tượng khác ngoài đối tượng người chơi của bạn vì các đối tượng đó cũng có thể bị thay đổi bởi các máy khách khác.

Tôi không thể nói cho bạn biết nên sử dụng cái nào vì tôi không biết trò chơi của bạn hoạt động như thế nào. Tất cả những gì tôi có thể làm là cung cấp cho bạn sự thật. Nếu bạn có bất kỳ câu hỏi nào hãy bình luận.


Bạn đề nghị cho phép khách hàng thực hiện vật lý của mình là một giải pháp chấp nhận được, nhưng bạn không liên quan đến gian lận.
cubuspl42

@ cubuspl42 Vì nỗ lực ở lại chủ đề tôi đã bỏ qua chi tiết. Tôi thấy phù hợp rằng OP có thể khám phá giải pháp hơn nữa để khám phá những cách tiềm năng để giảm thiểu gian lận.
tsturzl

một cách như vậy là cho phép độ lệch của những gì mỗi khách hàng cung cấp bị giới hạn ở một ngưỡng. Ví dụ, hầu hết các khách hàng nói rằng một đối tượng nhất định ở vị trí 5,8 hoặc 6,9 nhưng một báo cáo là 12,19 là tọa độ, có thể rơi ra khỏi ngưỡng so với mức độ lệch của nó so với các khách hàng khác. Đây chỉ là một giải pháp một phần, nhưng hầu hết các trò chơi chỉ cung cấp các giải pháp một phần để gian lận, do đó tại sao nó vẫn xảy ra. Giải pháp này không có nghĩa là họ gian lận, nhưng có nghĩa là vị trí của họ cần được sửa chữa và sẽ xuất hiện dưới dạng độ trễ đối với họ.
tsturzl

Chà, tôi hơi không đồng ý. Một số loại gian lận có thể sửa chữa, một số thì không. Ví dụ, theo tôi, đó là một thiết kế trò chơi tồi nếu người ta có thể tạo ra một tốc độ cho một game bắn súng trực tuyến cạnh tranh. Hoặc một số hack điên rồ cho phép bạn bay vòng quanh bản đồ với một loại đạn thần và đạn vô hạn (tôi tin rằng nó đã xảy ra trong Crysis 1 tại một số điểm). Đây là có thể sửa chữa, chỉ cần thiết kế trò chơi của bạn một cách chính xác. Những thứ như wallhack gần như không thể trộn được (nó sẽ đòi hỏi nguồn lực khổng lồ từ máy chủ). Aimbot hầu như không thể trộn lẫn. Giải pháp số 3 của bạn làm tăng nguy cơ của loại gian lận tồi tệ nhất này.
cubuspl42

@ cubuspl42 Tôi nghĩ bạn đang thiếu ý tưởng về một ví dụ là gì. Tùy chọn 3 có thể ngăn chặn chính xác vấn đề bạn đang nói đến. Thông thường bạn sẽ có một TCP chia sẻ vận tốc, và sau đó bạn có thể dễ dàng kiểm tra vận tốc giữa các máy khách và tạo sự đồng thuận, bạn cũng có thể thực hiện một số phép toán đơn giản để xác định xem tọa độ từ UDP có hợp lý hay không với giả định vận tốc được cung cấp giả sử khách hàng của bạn có đồng hồ được đồng bộ hóa (có thể được thiết lập trên kết nối từ đồng hồ CTNH).
tsturzl
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.