Mẹo giao tiếp giữa trò chơi trình duyệt JS và máy chủ node.js? [đóng cửa]


7

Tôi đang mày mò xung quanh với một số trò chơi bay hang động dựa trên Canvas đơn giản và cuối cùng tôi muốn làm cho nó trở thành nhiều người chơi. Kế hoạch là sử dụng Node.js ở phía máy chủ.

Dữ liệu được gửi qua sẽ bao gồm vị trí của từng người chơi, hướng, vận tốc và như vậy. Các chuyển động của người chơi là vật lý lực đơn giản, vì vậy tôi sẽ có thể ngoại suy các chuyển động trước khi cập nhật tiếp theo từ máy chủ.

Bất kỳ lời khuyên hoặc thực hành tốt nhất về phía truyền thông? Tôi đoán ổ cắm web là con đường để đi. Tôi có nên gửi thông tin trong mỗi lần vượt qua vòng lặp trò chơi hoặc với các khoảng thời gian được chỉ định không? Ngoài ra, tôi không phiền nếu nó không hoạt động với các trình duyệt cũ hơn.

Câu trả lời:


10

Gần đây tôi đã thực hiện một cuộc chiến chéo các tiểu hành tinh / hình học với Node.js / JavaScript:
http://github.com/BottoDen/NodeGame-Shooter

Nó có một Máy chủ béo để xử lý trò chơi và các máy khách mỏng, về cơ bản chỉ là các khung nhìn. Khách hàng thực hiện một số phép nội suy và những thứ để làm cho nó trông trơn tru.

Bạn có thể muốn xem hai tệp này chứa logic mạng bên dưới, cũng như các mô hình diễn viên và máy khách:
http://github.com/BottoDen/NodeGame-Shooter/blob/master/client/nodegame.client. js
http://github.com/BottoDen/NodeGame-Shooter/blob/master/server/nodegame.js

Toàn bộ trò chơi dựa trên các Diễn viên xử lý "sự kiện cập nhật" của họ (phần lớn được gửi cho khách hàng), phần lớn. Cũng có thể ẩn các tác nhân khỏi máy khách cụ thể để thực hiện, ví dụ, tàng hình.

Người ta cũng có thể ghi lại các trò chơi và chỉ cần đưa tin nhắn vào máy khách để phát lại chúng.

Theo như công nghệ:
WebSockets là cách để đi đến đây. Tôi cũng đã thực hiện mã hóa nhị phân tùy chỉnh cho JS, trong khi từ bỏ những thứ như hơn 2 chữ số thập phân trên số float, nhỏ hơn JSON khoảng 50% (và nhanh gấp 2 lần so với V8 so với mã hóa JSON gốc )


Cảm ơn! NodeGame Shooter trông khá thú vị, tôi sẽ phải dành chút thời gian với mã của nó.
Petteri Hietavirta

8

Tôi đề nghị để mọi thứ tách biệt.

Trong Stendhal, một MORPG 2D được viết bằng Java, chúng tôi đã làm những điều sau đây và nó hoạt động khá tốt:

  • Khách hàng sử dụng một vòng lặp nhanh để vẽ. Nó hoạt hình mượt mà và một số dự đoán để giảm thiểu độ trễ.
  • Máy chủ sử dụng một vòng lặp để xử lý tất cả logic trò chơi. Trong trường hợp của chúng tôi, nó có thể chậm hơn rất nhiều so với vòng lặp vẽ. Trong khi khách hàng đưa ra một số dự đoán, máy chủ luôn thắng.

Giao tiếp giữa máy khách và máy chủ được thực hiện bằng các hành động và nhận thức:

  • Các hành động được thực hiện bởi người dùng như "di chuyển lên" được gửi đến máy chủ khi chúng xảy ra. Máy chủ xếp hàng chúng và xử lý chúng trong vòng lặp riêng của nó.
  • Nhận thức được gửi từ máy chủ đến máy khách để cập nhật quan điểm của họ về thế giới.

Chúng tôi đã thực hiện một số "thủ thuật" để đạt được hiệu suất bổ sung:

  • Chúng tôi có hai loại thông báo nhận thức: Một loại đầy đủ được sử dụng khi đăng nhập và người chơi tham gia một khu vực. Và cập nhật gia tăng được sử dụng sau đó. Điều này tiết kiệm rất nhiều băng thông mạng.
  • Chúng tôi chia các thông điệp nhận thức thành một phần chung và riêng: Tất cả người chơi trong cùng một khu vực đều có chung một phần chung để chúng tôi tiết kiệm thời gian xử lý vì việc xê-ri hóa hóa ra là một cổ chai trên Java (không phải JavaScript).

À ha! Sắp xếp các hành động cho một vòng lặp thay vì xử lý chúng tại thời điểm cuộc gọi, chỉ là những gì tôi cần!
MetaGuru

3

Sử dụng socket.io , đây là thư viện trừu tượng WebSockets tiện dụng cung cấp dự phòng cho các trình duyệt không hỗ trợ nó.

Ngoài ra, nếu bạn đang tìm kiếm một mô hình trực tuyến như vậy, tôi sẽ khuyên bạn nên chuyển xử lý trò chơi sang máy chủ. Bằng cách đó, bạn chỉ cần giao tiếp thay đổi đồ họa và nhập chuột / bàn phím. Nó cũng giúp khá nhiều để ngăn chặn gian lận.

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.