Tần suất cập nhật Máy khách trò chơi về Thế giới là bao nhiêu?


10

Sử dụng socket.io , tôi có một giao tiếp tương tự như các game MMORPG khác, kết nối ổn định với các tin nhắn.

Trong thiết kế của tôi cho đến nay, khách hàng sẽ gửi vị trí và khung hình động của người chơi với mỗi khung cập nhật. Khi máy chủ nhận được thông báo đó, nó sẽ phát nó cho tất cả các máy khách, sau đó sẽ di chuyển đồ họa tương ứng.

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?

Ngoài ra, 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? Việc đầu tiên sẽ được thực hiện dễ dàng hơn.

Câu trả lời:


16

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ựcTà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 .


3
+1 Câu trả lời tuyệt vời. Tôi cũng đề nghị bắt đầu đơn giản và tối ưu hóa từ đó. Tin nhắn rác, chắc chắn, tự nhiên và thấy băng thông của bạn bắt đầu xì hơi. Đây là lý do tại sao nó tốt để tổ chức thử nghiệm căng thẳng. Bạn thực hiện cách tiếp cận ngây thơ nhất có thể và làm một số thử nghiệm; bạn làm một số tối ưu hóa; bạn căng thẳng kiểm tra lại, bạn tối ưu hóa hơn nữa, rửa sạch, lặp lại. Nếu nó hoàn toàn không quan trọng để thực hiện tối ưu hóa vào ngày đầu tiên, hãy tiếp tục; nhưng hãy lưu ý rằng ngay cả những tối ưu hóa tầm thường nhất cũng có thể mang những giả định mà sau này có thể bị từ chối trong môi trường sản xuất.
Kỹ sư

5

Đây là một ví dụ trong thế giới thực: RuneScape "tích tắc" cứ sau ~ 0,6 giây. Bạn có thể đọc về nó ở đây . Tôi tưởng tượng nó đơn giản hóa mọi thứ từ quan điểm của họ, vì trong kịch bản của họ, họ có thể chỉ định thời gian và độ trễ trong tích tắc thay vì mili giây. Và tất nhiên, với tốc độ đánh dấu lớn / chậm như vậy, người dùng có kết nối chậm không phải là một bất lợi rất lớn so với những người chơi khác.


0

Một cách làm việc là tách rời các thay đổi dữ liệu thực tế từ việc phát sóng các thay đổi đó. Khi một đối tượng thay đổi, hãy sửa đổi và đặt cờ 'bẩn' và khi đến lúc phát bất kỳ thay đổi nào, chỉ gửi dữ liệu cho các đối tượng được gắn cờ và xóa cờ. Các giá trị được thay đổi nhiều lần sẽ được tự động hợp nhất tại đây vì bản cập nhật của bạn chỉ gửi trạng thái tại thời điểm phát sóng. Bạn cũng có thể gắn cờ các đối tượng phụ hoặc thuộc tính riêng lẻ để bạn chỉ phát những gì đã thay đổi.

Ồ, và thường thì bạn sẽ không gửi các khung hình động đến máy chủ hoặc các máy khách khác. Trạng thái hoạt hình chính xác thường được coi là một chi tiết trình bày và để lại cho mỗi khách hàng giải quyết, và thay vào đó bạn chỉ cần đảm bảo mỗi khách hàng biết hoạt hình nào đang phát.


Tôi sẽ không Điều gì về tư thế hoặc một cái gì đó, tôi cần chắc chắn rằng tất cả các khách hàng nhìn thấy như nhau?
Lanbo

Điều này khá không thực tế để đảm bảo rằng mọi khách hàng đều nhìn thấy chính xác cùng một điều vì thông tin cần có thời gian để di chuyển, các khách hàng khác nhau có độ trễ mạng khác nhau, họ kết xuất ở tốc độ khác nhau, v.v. Vì vậy, cố gắng để mọi người hiển thị cùng một khung hình thường là một nỗ lực vô ích. Thay vào đó, bạn có thể chỉ cần cố gắng đảm bảo chúng bắt đầu hoạt hình giống nhau cùng một lúc, và điều đó là đủ tốt.
Kylotan
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.