Liệu một Máy chủ có thể gửi gì nhiều hơn một khu vực dựa trên gạch cho Khách hàng không?


8

Để bắt đầu, tôi có một nền tảng tốt về mạng (phần cứng, bộ định tuyến, ví dụ) nhưng rất ít kiến ​​thức về những điều cơ bản của lập trình mạng. Điều này có vẻ như là một câu hỏi ngu ngốc, nhưng tôi muốn biết những gì tôi đang nhận được trong khi thực hiện nhiều người chơi trong trò chơi của tôi.

Tôi đang tạo một thế giới dựa trên gạch, được tạo thông qua một mảng 2D đơn giản. Hãy nói điều gì đó như Thế giới [100] [100], vì đơn giản.

Hiện tại, phương thức kết xuất chỉ hiển thị các ô dựa trên độ phân giải của cửa sổ, cộng với một ô (để hiển thị mượt mà trong quá trình di chuyển.) Cho dù thế giới có lớn đến đâu, (10 x 10, 1 triệu x 1 triệu) thì kết xuất hoàn hảo.

Trò chơi không cần gì nhiều hơn để biết những gì hiện có thể nhìn thấy (được hiển thị trên màn hình +1) và ở một số thông tin có thể nhất của các ô trong một khu vực xung quanh người chơi.

Vì vậy, bất cứ điều gì nữa được gửi bởi Máy chủ sẽ không phải là thông tin đầy đủ. Ví dụ. Các vật phẩm nằm trên mặt đất, loại mặt đất, cây cối, v.v. sẽ không quan trọng trong khu vực bên ngoài tầm nhìn của người chơi, nhưng sẽ chỉ là những gì Khách hàng / Người chơi cần biết về các ô đó. (Ví dụ: 'tên đến' của Ultima Online nơi người chơi có thể biết một Nhân vật [người chơi hoặc quái vật] nằm ngoài các ô trong chế độ xem được hiển thị của họ.)

Tôi không biết nhiều về mạng, vì vậy có lẽ khi tôi học được điều này có thể trả lời câu hỏi của tôi. Tuy nhiên, tôi tò mò liệu đây là một giải pháp khả thi hay ý tưởng đơn giản là buồn cười.

Thông tin được gửi sẽ có diện tích khoảng 10,515 ô và mỗi ô chứa thông tin về những gì trên ô. Hiệu quả hơn, mọi thứ sẽ là một Object, trong đó ô chứa tất cả các Đối tượng trên ô. Ví dụ. Ngói [4] [4] giữ Kiếm # 23452, Rock2, Tree5, Player3, Monster4.

Các ô trống sẽ không gửi gì nhiều hơn loại địa hình [Cỏ, cát, nước] nếu chưa được tải trong quá trình Khởi tạo / Tải. Một số gạch sẽ có một số đối tượng [Tree2, Sword # 924, Gold, Corpse, Rock3].

Vì vậy, tôi không thể tưởng tượng rằng một ô sẽ có rất nhiều thông tin để gửi cho Máy khách từ Máy chủ, vì Khách hàng chủ yếu chỉ cần biết Texture cần được tải và Vị trí để đặt nó trên màn hình. Vị trí chỉ là hai số nguyên và Texture là một số nguyên cho một danh sách các tệp để báo cho khách hàng kết xuất.

Trong lúc điên rồ nhất, Máy chủ sẽ phải gửi 150 ô với thông tin chỉ một số đối tượng OnLOAD và từ đó, cập nhật chỉ thay đổi thành các ô (nếu có) và bất kỳ ô mới nào (10 đến 15 mỗi khi người chơi di chuyển theo hướng ) và hướng chuyển động cho các ký tự trên màn hình (để khách hàng có thể mô phỏng chuyển động mượt mà giữa các ô).

Tôi cho rằng tôi đúng khi nghĩ rằng đây là một lượng thông tin cực kỳ thấp được gửi qua internet hoặc giữa các đồng nghiệp, vì vậy nó có vấn đề gì với hiệu suất ngay cả khi kết nối bị lag? Hay tôi không biết gì về mạng đến nỗi đầu óc tôi sẽ bị thổi bay khi cuối cùng tôi cũng có thể mở cuốn sách của mình trên mạng nhiều người chơi?

Nếu đó là một lượng thông tin rất thấp được gửi giữa Máy khách / Máy chủ, thì việc tải toàn bộ Thế giới vào Khởi tạo có ý nghĩa hơn không? Hoặc 'Bản đồ' nếu Thế giới quá rộng lớn. Và sau khi LOAD, chỉ gửi các ô được cập nhật?

Tôi vẫn đang cân nhắc làm thế nào tôi nên xử lý dữ liệu cụ thể. Cuốn sách tôi đang sử dụng làm tài liệu tham khảo muốn tôi có Danh sách liên kết, nơi tôi thêm và xóa các đối tượng, vì vậy mọi thứ đều là một bool. "Có nhân vật không? Có cây không?"

Tôi đã nghĩ đến một cách tiếp cận khác, chẳng hạn như một thùng chứa các đối tượng và logic Máy chủ chỉ gửi những gì được yêu cầu để cho Khách hàng biết những gì cần kết xuất. Có thể với các đối tượng chứa thông tin mạng trong chính nó, được gửi ra khi được Máy chủ yêu cầu.


Tôi đề nghị bạn hãy xem freemmorpgmaker.com, công cụ này đã giúp tôi rất nhiều khi tôi mới bắt đầu. Kịch bản tương đối đơn giản và rất thú vị để làm việc. Mã đã dạy tôi mọi thứ tôi cần biết để tạo ra công cụ / trò chơi 2D của riêng tôi. Những gì bạn không nên học hỏi từ họ là làm thế nào để bảo mật máy chủ / máy khách của bạn.
Nick

Câu trả lời:


6

Bạn đang đi đúng hướng.

Hãy xem xét Minecraft. Minecraft chỉ tải các khu vực (còn gọi là chunk) ngay lập tức xung quanh người chơi. Đây là cách máy chủ có thể chạy mà không hết bộ nhớ và tại sao khách hàng không bị sa lầy khỏi lưu lượng mạng.

Nếu đó là một lượng thông tin rất thấp được gửi giữa Máy khách / Máy chủ, thì việc tải toàn bộ Thế giới vào Khởi tạo có ý nghĩa hơn không? Hoặc 'Bản đồ' nếu Thế giới quá rộng lớn. Và sau khi LOAD, chỉ gửi các ô được cập nhật?

Đây chính xác là những gì bạn nên làm. Chỉ gửi dữ liệu mà bạn cần gửi.

  1. Khi một khách hàng tham gia, hãy gửi cho nó một đoạn của bản đồ ô vuông (hoặc tất cả nếu nó, nếu bạn đang xử lý các khu vực nhỏ)
  2. Khi người chơi cố gắng sửa đổi một ô, gửi dữ liệu đó đến máy chủ.
  3. Khi một lát thay đổi trạng thái, gửi một gói với thông tin đó cho tất cả các khách hàng có liên quan.

Nếu bạn chỉ gửi một mảng 2D của IDS, kích thước của dữ liệu có thể rất thấp, đặc biệt là nếu bạn có ít hơn 256 loại gạch khác nhau. Trong trường hợp đó, bạn có thể sử dụng một byte đơn (hoặc ký tự không dấu). Vì vậy, nếu bạn đang gửi các ô 100x100 cho trình phát và mỗi ô chỉ bao gồm một byte duy nhất ... Bạn hiểu ý tưởng đó. Nó không phải là nhiều dữ liệu.

Cộng đồng Minecraft đã thực hiện một công việc tuyệt vời khi ghi lại giao thức của mình: http://mc.kev009.com/Protocol

http://www.minecraftwiki.net/wiki/Classic_server_protatio


1
Wow, cảm ơn bạn rất nhiều! Đây là một sự tăng cường niềm tin lớn mà tôi đã nói rằng tôi đang đi đúng hướng, khi tôi biết rất ít. Nó cho tôi biết rằng tôi đang hiểu mọi thứ một cách chính xác và kỹ thuật tốt nhất có thể. Tôi tự tin rằng nếu tôi tiếp tục học hỏi, tôi sẽ làm đủ. Thật là thỏa đáng khi nghe lời khuyên tích cực, và không "Bạn đang làm sai!" lol :)

Phải mất một thời gian dài trước khi tôi tập trung thần kinh để tham gia các trò chơi nhiều người chơi và 3D. :)
Nick Caplinger

Ngoài ra, lời khuyên tích cực là những gì cộng đồng này phát triển mạnh. Tôi khuyến khích mọi người đóng góp bằng mọi cách họ có thể!
Nick Caplinger

3

Nói chung, chỉ nên gửi thông tin cho khách hàng được cho là hiển thị cho người chơi. Theo nguyên tắc này làm giảm lưu lượng mạng và ngăn ngừa gian lận.

Nhưng hãy nhớ rằng khi người chơi di chuyển nhân vật của họ, bạn chắc chắn muốn bắt đầu di chuyển về phía khách hàng trước khi nhận được xác nhận từ máy chủ để làm cho trò chơi xuất hiện ít lag hơn và phản ứng nhanh hơn. Điều đó có thể có nghĩa là bạn cũng muốn bắt đầu cuộn màn hình đến một khu vực chưa được tải. Điều này buộc bạn phải để trống phần bản đồ này và thay thế nó bằng thế giới thực khi nó đã được tải. Đó sẽ là một công cụ tuyệt vời. Vì lý do đó, bạn nên tải trước khu vực trong một bán kính nhất định xung quanh màn hình người chơi.

Kích thước của khu vực được tải sẵn phụ thuộc vào tốc độ người chơi của bạn có thể di chuyển và độ trễ trung bình của họ sẽ là bao lâu.


-1

Lượng dữ liệu bạn đang gửi từ Máy chủ đến Máy khách có thể không đáng kể. Nếu đây là tất cả những gì bạn cần gửi, tôi sẽ đề nghị tải càng nhiều càng tốt trên Load, vì vậy nó thậm chí còn ít dữ liệu hơn. Số lượng được gửi khi tải sẽ đủ nhỏ để chứng minh thời gian tải, việc sử dụng bộ nhớ sẽ gần như không tồn tại trừ khi thế giới của bạn quá khổ một cách lố bịch và bạn sẽ cần cập nhật hầu như không có dữ liệu.

Tôi tưởng tượng bạn cũng có thể thực hiện một số thủ thuật gọn gàng để tối ưu hóa dự đoán độ trễ bù cho độ trễ trung bình mà người dùng trải nghiệm, cho phép chuyển động có thể dự đoán được với các ký tự.

Ngoài ra, việc ưu tiên dữ liệu không đáng kể với chuyển động Nhân vật và các hành động / phản ứng của Nhân vật được ưu tiên cao nhất có thể giúp đảm bảo ngay cả những người chơi bị lag cũng cảm thấy rất ít độ trễ.

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.