Tôi sẽ tiếp cận điều này từ một cuộc thảo luận cấp cao và sau đó làm việc với các câu hỏi của bạn. Để tiết lộ, tôi không có kinh nghiệm cá nhân khi sử dụng socket.io nhưng tiếp xúc nhiều với không gian vấn đề liên quan đến MMORPG.
Thiết kế kiến trúc mạng của công cụ MMORPG và / hoặc lựa chọn dự án trung gian hoặc nguồn mở để cung cấp chức năng là một trong những quyết định khó khăn hơn ảnh hưởng bởi thiết kế trò chơi, ngân sách và chuyên môn kỹ thuật của nhóm. Sự lựa chọn cuối cùng sẽ ảnh hưởng đến các quyết định kiến trúc khác (và đôi khi là cả quyết định thiết kế).
Là nhà phát triển của MMORPG, chúng tôi lên kế hoạch cho thành công lớn (thường được gọi là thành công thảm khốc) khi số lượng lớn kích hoạt đèn cảnh báo và còi báo động. Một trong những con số lớn đáng sợ mọc lên là trong các thuật toán có N bình phương (N ^ 2 sau đây), trong câu hỏi của bạn, điều đầu tiên nhảy ra với tôi là nó có vẻ như thiết kế kêu gọi một thực thể truyền phát thông tin tới tất cả các thực thể kết nối khác. Đây là ví dụ kinh điển về vấn đề N ^ 2.
MMO thường tiếp cận giải quyết các vấn đề N ^ 2 bằng cách tấn công vấn đề theo nhiều cách khác nhau; hệ thống nhận thức (tình huống, không gian, v.v.) trong đó một thực thể nhận thức được một số tập hợp con của tất cả các thực thể khác, phân chia người chơi thành các "mảnh vỡ" khác nhau, phân vùng người chơi trong "khu vực" và / hoặc tiến hành, thực hiện cơ chế trò chơi làm nản lòng quá nhiều những người chơi tụ tập lại với nhau (cơn bão dịch chuyển của Asheron Call), v.v.
Hầu hết các game MMORPG và nhiều công cụ FPS có kiến trúc mạng khá tinh vi hỗ trợ nhiều tính năng bao gồm:
- đường dẫn truyền thông đáng tin cậy và không đáng tin cậy (TCP, triển khai tùy chỉnh các gói UDP và UDP đáng tin cậy)
- định hình băng thông (ưu tiên, tuổi thọ, v.v.)
- tự động sao chép dữ liệu trường / viarable và các cuộc gọi chức năng
- bộ dữ liệu nguyên tử (tức là dữ liệu được truyền thông cùng nhau)
- cập nhật riêng biệt (tức là nơi mọi chuyển đổi đều quan trọng)
- hiệu chỉnh độ trễ
- một loạt các thủ thuật để làm cho khách hàng cảm thấy nhanh nhạy
Tôi thấy rằng Tài liệu mạng không thực và Tài liệu mạng van cung cấp một mồi tốt về nhiều vấn đề.
Vì vậy, bây giờ hãy tiếp cận các câu hỏi.
Sẽ là một ý tưởng tốt hơn để 'thu thập' những thứ này và phát chúng, giả sử, một lần trong 1/10 giây?
Thật khó để cung cấp một câu trả lời có hoặc không đơn giản ở đây ... bởi vì nó phụ thuộc vào quy mô (số lượng thực thể quan sát), tần suất cập nhật và kích thước của các cập nhật. Ví dụ, thu thập tất cả chúng có thể là sai lầm khủng khiếp nếu kích thước của các bản cập nhật có thể thổi một bộ đệm ở đâu đó.
Ứng dụng khách cho các game MMORPG và FPS thường được thiết kế sao cho chúng sẽ trực quan hóa thứ gì đó "trông" ngay cả khi chúng không nhận được bản cập nhật cho nhiều khung cập nhật hơn "bình thường". Khi sử dụng giao tiếp không đáng tin cậy (UDP), bạn có thể hy vọng sẽ mất một số cập nhật vào khoảng trống, khách hàng có thể bù vào điều này bằng cách gửi các cập nhật thường xuyên hơn mức có thể được sử dụng với một phương tiện giao thông đáng tin cậy.
Từ một đánh giá thảo luận về tài liệu socket.io, có vẻ như nó hỗ trợ cả con đường giao tiếp đáng tin cậy và không đáng tin cậy (dễ bay hơi trong thuật ngữ của nó).
Tôi sẽ tiếp cận điều này trước bằng cách giải quyết, với tần suất cần cập nhật ...
Nếu người chơi di chuyển theo đường thẳng với tốc độ không đổi, tần suất cập nhật thấp hơn là tốt vì các khách hàng quan sát có thể dự đoán với độ chính xác cao, nơi người chơi sẽ ở bất kỳ thời điểm nào. Khi người chơi đang quay vòng tròn chặt chẽ hoặc thay đổi hướng nhanh, thì cần phải cập nhật thường xuyên hơn nhiều. Ngược lại, khi một người chơi hoàn toàn không di chuyển thì không có lý do gì để gửi thông tin cập nhật chuyển động cả.
Không có vấn đề gì, có lẽ không (nói chung) là cần thiết để gửi cập nhật mọi khung hình từ máy khách đến máy chủ. Bản thân máy chủ có thể chọn gửi tin nhắn cho từng khung trong đó có khung hoặc trì hoãn chúng (xem định hình băng thông, mức độ ưu tiên và cập nhật trọn đời).
Các loại cập nhật khác có các đặc điểm khác nhau ... ví dụ: xem xét trường "sức khỏe" được sửa đổi khi người chơi hoặc sinh vật bị hỏng. Một cách để thực hiện điều này là phát sóng mỗi thay đổi ngay lập tức khi nó xảy ra, nhưng điều này dẫn đến lãng phí xử lý và băng thông nếu giá trị được thay đổi nhiều lần trong một khung hoặc các khung liên tiếp (kiến trúc mạng thực hiện định hình băng thông giải quyết vấn đề này bằng cách kết hợp các bản cập nhật với chỉ gần đây nhất được gửi đến một khách hàng quan sát khi họ có băng thông khả dụng).
khách hàng có nên gửi nhiều tin nhắn khác nhau (exp đạt được, nhấp vào mục) ngay khi chúng xảy ra hay chỉ là một tin nhắn được thu thập?
Một lần nữa, không có đơn giản có hoặc không có câu trả lời sẽ làm việc ở đây. Tùy thuộc vào ý nghĩa chính xác của bạn bằng cách thu thập ... cả hai có thể đúng trong các trường hợp khác nhau và cũng phụ thuộc vào việc triển khai lớp mạng.
Thu thập tin nhắn cho một thực thể cụ thể được gửi dưới dạng một tin nhắn có thể (tùy thuộc vào việc triển khai) làm giảm chi phí băng thông để gửi tin nhắn (giảm chi phí của bạn) ngược lại (tùy thuộc vào việc triển khai, như ánh xạ trường / giá trị được truyền qua chuỗi) yêu cầu so với một loại tin nhắn cụ thể đơn giản hơn.
Xem lại tài liệu của socket.io, tôi thấy rằng chi phí tin nhắn nằm ở đầu phổ cao hơn, có lợi cho việc thu thập các bản cập nhật để gửi dưới dạng tin nhắn tổng hợp thay vì nhiều cập nhật đơn lẻ.
Tôi khuyên bạn nên xem lại tất cả các bản cập nhật mà bạn dự tính sao chép, ví dụ như hầu hết các MMORPG và FPS không bận tâm gửi người chơi đã nhấp vào các sự kiện X để quan sát khách hàng trừ khi điều đó cũng dẫn đến thay đổi trạng thái cho một đối tượng mà họ cũng biết .