Kết nối và chuyển động trong UNITY của MMORPG


8

Tôi đang lập trình một máy chủ chuyên dụng trong C # bằng BeamServer2 DLL. Đầu tiên tôi muốn có thể thấy những người chơi khác di chuyển trên bản đồ Omuni đã được tạo của chúng tôi. Điều này tôi đã làm bằng cách chỉ gửi vị trí của bạn đến máy chủ mỗi khung. Điều này đã được giải quyết và tôi đã có thể chơi với một vài người bạn nhưng phong trào không bị chậm trễ. Vì vậy, tôi bắt đầu cố gắng thêm tính năng làm mịn chuyển động và một số bảo mật để họ không thể gửi một vị trí sai đến máy chủ mà không cần máy chủ ngăn nó tiếp cận các máy khách khác.

Những gì tôi đã làm, tôi đã tạo ra một masterClient có bộ điều khiển MovementContoder trên remotePlayer. Khi một khách hàng muốn di chuyển, anh ta di chuyển cục bộ và gửi tin nhắn đến máy chủ với hướng di chuyển. Máy chủ sẽ lấy tốc độ từ chối và gửi nó đến masterClient. MasterClient hơn di chuyển remotePlayer giống như remotePlayer tự di chuyển. Khi anh ta ngừng di chuyển, anh ta gửi một tin nhắn với vị trí ngần ngại trong đó. Thành thạo hơn kiểm tra xem vị trí mà anh ta đã đến có gần với vị trí anh ta có từ máy khách hay không, nếu nó thực tế theo ping của máy khách, máy chủ sẽ đặt anh ta vào vị trí của máy khách.

Điều này hoạt động, nhưng tôi vẫn có một vấn đề lagg và tôi không biết làm thế nào để khắc phục điều này. Tôi phải thực hiện chuyển động trơn tru trên máy khách nhưng tôi phát hiện ra rằng tôi chỉ có thể lerp (x / 2, y / 2, z / 2) đến vị trí và đặt anh ta vào vị trí thực sự tiếp theo, tôi đã thất bại ở đó và tôi sẽ thử lại sớm. Ngay cả khi điều đó được thêm vào, tôi không chắc chắn liệu lagg có được sửa hay không.

Bất kỳ kỹ thuật, đề xuất, câu hỏi, ...? Cảm ơn, Diede.

Câu trả lời:


8

Có rất nhiều vấn đề / nhiệm vụ liên quan khi lập trình các trò chơi mạng thời gian thực "không bị lag".

  • tốc độ phần cứng (nguồn CPU cần thiết cho trình phát cả máy khách và máy chủ)
  • khoảng cách mạng và thiết bị (kết nối LAN hoặc WAN?)
  • băng thông máy chủ (có bao nhiêu người chơi)

Thứ hai, bạn có những "kẻ xấu" luôn cố gắng gian lận trong các trò chơi. Nếu trò chơi của bạn được công khai, hãy xem xét những gì sẽ xảy ra nếu tôi ngồi xuống và tiêm các gói mạng "sai". Xem xét nếu ai đó đăng "vị trí không thể truy cập" hoặc "toàn bộ sức khỏe / đạn".

Đề xuất của tôi cho kiến ​​trúc của bạn để bắt đầu, sẽ là một cái gì đó như thế này:

  • Máy chủ, kiểm soát tất cả dữ liệu quan trọng, tính toán VÀ xác nhận chuyển động.
  • Khách hàng, nhận dữ liệu về những gì sẽ hiển thị trên màn hình + một số dữ liệu "nghĩ trước" về các đối tượng chuyển động.

Hầu hết các FPS thời gian thực như tôi biết, có một số loại "chúng tôi biết bạn đang di chuyển theo hướng này với tốc độ này, vì vậy chúng tôi chỉ mô phỏng điều đó cho đến khi chúng tôi nhận được các chi tiết khác từ máy chủ"

Vì vậy, khách hàng của bạn nên đăng "những gì nó yêu cầu" và thậm chí có thể bắt đầu tự di chuyển theo hướng đó, nhưng nó có thể bị máy chủ "buộc phải quay lại" nếu máy chủ từ chối chuyển động. Ở đây bạn phải suy nghĩ, điều gì sẽ xảy ra nếu khách hàng đăng "các chuỗi sai" bên ngoài bản đồ hoặc "nhảy" một cách đột ngột. Máy chủ cần theo dõi nếu vị trí mới có thể từ điểm trước đó HOẶC máy chủ chỉ nhận được thông báo: "CLIENT MOVE FORWARD 200" và sau đó máy chủ xử lý những gì sẽ làm theo dữ liệu bản đồ và trò chơi.

Điều này sẽ cung cấp một số độ trễ, nhưng một lần nữa, nếu bạn để máy khách nhận được những dữ liệu này và thực hiện một số phép toán, nó không cần cập nhật mỗi ms / khung hình, nó có thể bị trễ một chút mà không có độ trễ đáng chú ý trên màn hình.

Có lẽ bạn thậm chí có thể chia bản đồ thành "gạch ảo" (nếu là trò chơi vectơ) để bạn có cách nhanh chóng để tính toán vị trí của các đối tượng tiếp theo.

Thế giới Warcraft / Chiến trường / Phản công

Tôi tin rằng WOW cũng đang làm theo cách này. Bạn nhấn một phím, máy chủ nhận được "điều ước" chuyển động của bạn và trả lời với "bạn đang di chuyển ngay bây giờ" và sau đó máy khách hiển thị điều này + máy chủ mô phỏng vị trí mới trên máy chủ theo một kiểu "phiên pr. Client". Đây là "số lượng người chơi pr tối đa" đang trở nên khó chịu, bởi vì máy chủ của bạn phải theo dõi tất cả mọi người và về cơ bản làm điều này như "quay vòng" - nhưng nhanh đến mức trông như thật.

Vì thế...

Foreach (Client in GameSessionList)
{
   ParseInput();
   ParseMovement(); // including collission test
   ResponseSend(); // new positions+movement data for client and objects/other players
}

3
Bất kể giá trị của câu trả lời của anh ta, có lý do nào để thô lỗ?
Konrad

Tôi có ấn tượng rằng trong hầu hết các game FPS, máy khách và máy chủ đều va chạm độc lập và máy chủ sửa lỗi máy khách nếu chúng thay đổi quá nhiều, thay vì máy khách chỉ mô phỏng.
Magus

Tôi không biết làm thế nào mọi FPS làm điều đó. Nhưng có, ví dụ. Sê-ri BF có một cái gì đó mà họ gọi là Netcode, có nghĩa là họ thực hiện các phép tính cục bộ và gửi kết quả đến máy chủ để xác minh và phân phối kết quả (như những gì tôi đã nói). Điều này có thể phải làm với họ một lượng lớn "hạt" / chi tiết cần phải được chuyển đi bằng cách khác. Vì WOW là một thế giới tĩnh hơn và bạn không có xung đột giữa các nhân vật (ở chế độ bình thường) nên bạn có thể "trượt" qua người khác.
BerggreenDK

2

Phần thách thức trong bù độ trễ là bạn sẽ nhận được các bản cập nhật từ các khách hàng không theo thứ tự. Lệnh của máy khách bị lag được gửi tại thời điểm T rất có thể đến sau khi lệnh máy khách không bị lag được gửi ở T + 40ms. Áp dụng các lệnh theo thứ tự bạn nhận được chúng sẽ dẫn đến tất cả các loại khó chịu. Làm điều đó một cách chính xác mặt khác bao gồm thời gian quay trở lại và phát lại tất cả các lệnh đã được ban hành kể từ đó.

Không có cách dễ dàng xung quanh điều này, nhưng có nhiều giải pháp hợp lệ. Bạn có thể tìm thấy một tương đối dễ dàng được mô tả ở đây .

Có rất nhiều nghiên cứu trong lĩnh vực này, hãy nhìn xung quanh!


1

Tôi sẽ tạo ứng dụng khách giống như một trò chơi không nối mạng. Đó là, bất cứ điều gì bạn làm bạn làm điều đó một cách vô tận trên máy khách. Sau đó thêm, song song với đó, mã mạng của bạn. Mã này sẽ nhận được dữ liệu chuyển động. Đơn giản như từ coords, hướng và tốc độ. Nó chỉ gửi cái này đến máy chủ xác nhận. Máy chủ gửi cho bạn một vị trí ok hoặc mới.

Vì vậy, bạn có tất cả các mã khách hàng của bạn đang chạy như một mình trên thế giới. Sau đó, nó chỉ nhận được dữ liệu chỉnh sửa mới từ máy chủ hoặc ok. Nếu bạn nhấn về phía trước và giữ nó trong mười giây, thì máy chủ sẽ chỉ nhận được một dữ liệu đó. Bạn có thể điều chỉnh việc gửi / nhận dữ liệu mỗi giây ngay cả khi bạn chỉ giữ nút chuyển tiếp hoặc nếu không, nếu bạn gặp sự cố tăng vọt, bạn có thể chạy mãi mãi.

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.