2011-11-17 40 views
31

Tôi quan tâm đến việc xây dựng một trò chơi nhiều người chơi trong thời gian thực nhỏ, sử dụng HTML5/JavaScript cho ứng dụng khách và có thể là Java cho phần mềm máy chủ.WebSockets có phù hợp với các trò chơi nhiều người chơi trong thời gian thực không?

Tôi đã xem xét WebSockets một chút, nhưng có vẻ như tôi đã hiểu sai về WebSockets thực sự là gì. Ban đầu tôi đã nghĩ về WebSockets như cách JavaScript xử lý các socket TCP, giống như chúng được sử dụng trong Java và các ngôn ngữ khác, nhưng nó xuất hiện có một quá trình bắt tay phải diễn ra, và mỗi lần truyền bao gồm nhiều HTTP overhead (và trong trường hợp đó, những lợi ích trên Ajax dường như không thú vị như ở cái nhìn đầu tiên)?

Trên một chủ đề liên quan, có bất kỳ lựa chọn thay thế nào tốt hơn cho WebSockets cho mục đích này không (trò chơi nhiều người chơi trong thời gian thực trong JavaScript)?

+2

Thực tế mỗi lần truyền chỉ chứa hai byte trên cao. Việc bắt tay http chỉ xảy ra khi mở một websocket mới và bạn có thể giữ cho websocket mở miễn là trình duyệt vẫn nằm trên trang đó. –

+1

Có, họ đang có. bắt tay HTTP được thực hiện một lần để mở socket. Vì vậy, chi phí rất lớn nếu bạn đóng socket sau một tin nhắn, và không đáng kể nếu bạn giữ ổ cắm mở mãi mãi. – Raynos

+0

Tại sao quá trình bắt tay lại phức tạp như vậy? Từ những gì tôi nhớ lại, người ta phải đọc trong một số chuỗi, cuối cùng là một số ký tự [ngẫu nhiên?] Mà sau đó phải được mã hóa base64 theo một cách nào đó và gửi lại cho khách hàng. Tôi đã cố gắng viết mã bắt tay phía máy chủ cho mình, nhưng nó không hoạt động (quá trình bắt tay không bao giờ hoàn thành, vì vậy tôi không bao giờ có thể gửi và lấy các gói của riêng mình). Tôi đã đạt được kết quả chính xác tương tự khi sử dụng một gói Java mà người khác đã viết để làm điều tương tự. – Josh1billion

Trả lời

32

WebSockets là giải pháp tốt nhất cho các trò chơi nhiều người chơi trong thời gian thực chạy trong trình duyệt web. Như đã chỉ ra trong các bình luận có một cái bắt tay ban đầu khi kết nối HTTP được nâng cấp nhưng khi kết nối được thiết lập, WebSockets cung cấp cơ chế kết nối trễ thấp nhất cho truyền thông hai hướng giữa máy chủ và máy khách.

tôi muốn khuyên bạn nên xem này: https://www.youtube.com/watch?v=_t28OPQlZK4&feature=youtu.be

Có một cái nhìn tại địa chỉ:

Giải pháp duy nhất TCP thô sẽ được sử dụng một plugin hỗ trợ một số loại đối tượng TCPClient. Tôi khuyên bạn nên thử WebSockets.

Bạn có thể tìm thấy một số tùy chọn here. Chỉ cần tìm kiếm WebSockets trong trang.

Ngoài ra, hãy xem WebRTC. Tùy thuộc vào mục đích trò chơi của bạn và bạn có cần máy chủ quản lý trạng thái trò chơi hay không, bạn có thể sử dụng công nghệ này để liên lạc ngang hàng. Bạn vẫn có thể cần một giải pháp để xử lý việc đưa người chơi vào các nhóm - trong trường hợp đó WebSockets là giải pháp nhanh nhất/tốt nhất.

+2

Liên kết tới video Rob Hawkes bị hỏng, đây có phải là cuộc nói chuyện giống nhau không? http://youtu.be/_t28OPQlZK4 –

+2

@JasonSperske - vâng, cảm ơn. Tôi cũng đã cập nhật các ví dụ. – leggetter

7

Trò chơi nhiều người chơi yêu cầu máy chủ gửi ảnh chụp nhanh định kỳ của trạng thái thế giới cho khách hàng. Trong bối cảnh của một trình duyệt HTML/js ứng dụng bạn có ít sự lựa chọn: bỏ phiếu, websocket hoặc viết plugin của riêng bạn để mở rộng khả năng trình duyệt.

Việc bỏ phiếu HTTP chẳng hạn như BOSH hoặc Bayeux rất phức tạp nhưng giới thiệu chi phí và thời gian chờ của mạng. Các websocket được thiết kế để vượt qua giới hạn của họ và chắc chắn là phản ứng nhanh hơn.

Thư viện, chẳng hạn như cometd hoặc socket io, cung cấp sự trừu tượng hóa giao thông và giải quyết các sự cố tương thích với trình duyệt cho bạn. Trên hết, nó cho phép chuyển đổi giữa các phương tiện cơ bản và so sánh hiệu suất của chúng mà không cần nỗ lực.

Tôi đã mã hóa multiplayer arcade game với socket.io và đo độ trễ 2ms thông thường với một websocket và khoảng 30ms với xhr-polling trên lan. Nó đủ cho một trò chơi nhiều người chơi.

Tôi khuyên bạn nên xem nodejs và ổ cắm.io để có thể chia sẻ mã giữa máy khách và máy chủ, bạn cũng có thể mượn một số mã nhiều người chơi tại [3].

0

Nếu bạn định sử dụng JavaScript cho trò chơi của mình (như bạn) thì WebSocket là lựa chọn tốt nhất cho bạn. Và nếu bạn muốn hỗ trợ phiên bản cũ hơn của Internet Explorer thì hãy nghĩ đến hệ thống Signal R mà Microsoft phát triển. Họ đang sử dụng WebSocket dưới mui xe, nhưng họ cũng có một vài lựa chọn rơi trở lại ... do đó, giao thức sẽ sử dụng giải pháp tốt nhất hiện có sẵn.

http://signalr.net/

+2

Socket.io cũng có các nhược điểm là – JorgeGarza

6

Tôi không chắc chắn nếu WebSockets vẫn là công cụ tốt nhất cho mạng một nhiều thời gian thực những ngày này (2017). WebRTC là công nghệ mới hơn mang đến tiềm năng hiệu suất cao hơn nhiều. Và những ngày, WebRTC cũng là dễ dàng hơn để làm việc với nhờ các thư viện sau:

  • node-webrtc đơn giản hoá server-side mạng
  • webrtc-native mà còn cung cấp một thư viện server-side, và có thể nhanh như tên gọi của nó gợi ý
  • electron-webrtc cung cấp một thực hiện đó là một trận đấu tốt nếu bạn muốn đóng gói trò chơi của bạn sử dụng electron

Ngoài ra, nếu bạn muốn được tha chi tiết thực tế về triển khai mạng và bạn đang tìm kiếm thư viện cung cấp giao diện nhiều người chơi cấp cao hơn, hãy xem Lance.gg. (từ chối trách nhiệm: Tôi là một trong những người đóng góp).

+0

Nếu chúng ta cần một máy chủ có thẩm quyền, để ngăn chặn người chơi lừa đảo, WebRTC có hoạt động không? Làm cách nào để ngăn chặn gian lận với WebRTC? – trusktr

+0

Và, có vẻ như gửi dữ liệu nhị phân sẽ nhanh nhất. Mọi người đang (de) serializing JSON với WebSockets. Không phải là chậm? Làm thế nào chúng ta có thể tạo một mạng UDP có thẩm quyền trên web? – trusktr

0

Về cơ bản, bạn có 3 lựa chọn tại thời điểm viết bài này:

WebSockets

WebSockets là một giao thức thông điệp nhẹ mà sử dụng giao thức TCP, chứ không phải là một việc thực hiện Javascript của TCP socket, như bạn' đã lưu ý. Tuy nhiên, ngoài sự bắt tay ban đầu, không có tiêu đề HTTP nào được chuyển đến và vượt qua điểm đó. Sau khi kết nối được thiết lập, dữ liệu sẽ tự do, với chi phí tối thiểu.

dài bỏ phiếu

dài bỏ phiếu, trong Tóm lại, liên quan đến việc bỏ phiếu khách hàng máy chủ để biết thông tin mới theo định kỳ với các yêu cầu HTTP. Điều này cực kỳ tốn kém về mặt CPU và băng thông, vì bạn đang gửi một tiêu đề HTTP mới cực nhanh mỗi lần. Về cơ bản, đây là lựa chọn duy nhất của bạn khi nói đến các trình duyệt cũ hơn và các thư viện như Socket.io sử dụng bỏ phiếu dài làm dự phòng trong những trường hợp này.

WebRTC của

Ngoài những gì đã được đề cập đã, WebRTC cho phép truyền thông qua UDP. UDP từ lâu đã được sử dụng trong các trò chơi nhiều người chơi trong môi trường không dựa trên web vì chi phí thấp của nó (tương đối so với TCP), độ trễ thấp và tính chất không chặn.

TCP "đảm bảo" rằng mỗi gói sẽ đến (tiết kiệm cho lỗi mạng nghiêm trọng) và chúng sẽ luôn đi theo thứ tự chúng được gửi. Điều này là rất tốt cho các thông tin quan trọng như đăng ký điểm số, số truy cập, trò chuyện, v.v.

UDP, mặt khác, không có sự bảo đảm như vậy. Các gói có thể đến theo bất kỳ thứ tự nào, hoặc hoàn toàn không. Điều này thực sự hữu ích khi nói đến dữ liệu ít quan trọng được gửi ở tần số cao và cần phải đến càng nhanh càng tốt, chẳng hạn như vị trí trình phát hoặc đầu vào. Lý do là các luồng TCP bị chặn nếu một gói duy nhất bị trì hoãn trong quá trình vận chuyển, dẫn đến những khoảng trống lớn trong bản cập nhật trạng thái trò chơi. Với UDP, bạn có thể đơn giản bỏ qua các gói đến trễ (hoặc không hề) và tiếp tục với gói tiếp theo bạn nhận được, tạo trải nghiệm mượt mà hơn cho người chơi. Tại thời điểm viết bài này, WebSockets có lẽ là lựa chọn tốt nhất của bạn, mặc dù việc chấp nhận WebRTC đang mở rộng nhanh chóng, và thực sự có thể thích hợp hơn khi bạn chơi xong trò chơi của mình, vì vậy đó là điều cần xem xét.

Các vấn đề liên quan