Tôi đang triển khai MMO nơi người chơi bay vào vũ trụ trên con tàu không gian của mình điều khiển nó bằng các phím mũi tên và hợp tác với những người chơi khác.
Tôi muốn triển khai nó để người chơi có thể tránh tàu của mình khỏi tên lửa hoặc thứ gì khác, vì vậy tôi đang cố gắng dự đoán toàn bộ trạng thái trò chơi ở phía máy khách bằng thuật toán mô phỏng thế giới giống như sử dụng máy chủ. Thế giới trò chơi đó được viết trên C # và sẽ được gọi trực tiếp trong máy khách (nó được viết trên Unity3D) và thông qua CLR trên máy chủ C ++ (trong Linux). Kết nối thông qua UDP.
Vấn đề là làm thế nào để duy trì, ví dụ, 1000 người chơi trong một bản đồ (loại trừ tất cả các đối tượng trò chơi khác, mob ...): Hãy nói rằng tôi sẽ:
- đồng bộ hóa máy chủ với khách hàng 50 lần mỗi giây
- gửi cho mỗi trạng thái khách hàng của chính các đối tượng trò chơi đó (và người chơi) mà anh ta có thể nhìn thấy (trong một số bán kính)
- phải gửi 100 đối tượng cho mỗi người chơi trong bán kính xem của mình
- phải gửi trung bình 50 byte cho mỗi đối tượng trò chơi (đó là id, x, y coords, rotation, state ...)
vì vậy, nó sẽ cần phải có băng thông mạng như vậy: 1000 (máy khách) * 50 (lần mỗi giây) * 100 (đối tượng để gửi cho mỗi người chơi) * 50 (byte mỗi đối tượng) = 250 000 000 byte mỗi giây! Điều đó là không thể!
Có thể giảm giá trị này bằng cách nào đó? Ví dụ: để khách hàng mô phỏng hoàn toàn thế giới trò chơi của họ (trong một khoảng thời gian dài) và gửi cho họ chỉ là đầu vào của các khách hàng khác và đồng bộ hóa thế giới trò chơi, giả sử, cứ sau vài giây, nó sẽ gây ra các vấn đề đồng bộ hóa kỳ lạ khi xích vì tính toán nổi .
Dù sao, làm thế nào các trò chơi như vậy được lập trình theo cách phổ biến? Cảm ơn bạn.