Chạy cả máy chủ và máy khách trong cùng một tiến trình


9

Câu hỏi

Tôi mới bắt đầu làm việc với Lidgren và kết nối mạng lần đầu tiên và tôi nhận ra rằng có thể chạy cả máy chủ và máy khách trong cùng một quy trình.

Là thực hành này không khuyến khích vì bất kỳ lý do?

Bối cảnh

Lý do tôi hỏi là vì tôi đưa ra giả thuyết rằng khái niệm này có thể cho phép tôi coi cả hai chế độ chơi đơn và nhiều người chơi là một và giống nhau, điều này sẽ rất hữu ích.

Theo dòng suy nghĩ của tôi, đây là phân phối tôi có trong tâm trí:

  • Singleplayer - 1 máy chủ + 1 máy khách trong cùng một quy trình. Truyền thông nhanh như thế nào?
  • Nhiều người chơi - Giống như một người chơi đơn cho máy chủ + 1 khách hàng quảng cáo cho mỗi người chơi khác .

Luồng thực thi mà tôi hình dung là để khách hàng nhận dữ liệu nhập của người dùng và gửi thông báo đến máy chủ. Sau đó, máy chủ xác nhận nó và phát một hành động được thực hiện bởi tất cả các máy khách. Sẽ không có vấn đề gì nếu chỉ có một khách hàng (tức là người chơi đơn) hoặc nhiều khách hàng (tức là nhiều người chơi).

Câu trả lời:


7

Về cơ bản, đây là một quá trình so với câu hỏi luồng, cả hai đều không quá khác nhau, đôi khi các luồng được gọi là các tiến trình nhẹ. Sự khác biệt lớn nhất là một quy trình riêng biệt có không gian địa chỉ riêng nhưng có những khác biệt khác (1):

Mỗi quá trình

  • Không gian địa chỉ
  • Biến toàn cầu
  • Mở tập tin
  • Quá trình con
  • Đang chờ báo động, ngắt và xử lý tín hiệu

Mỗi chủ đề

  • Chương trình truy cập
  • Đăng ký
  • Cây rơm
  • Tiểu bang

Dựa trên những khác biệt này, có thể có ích khi có một luồng máy chủ và máy khách trong cùng một quy trình để bạn có thể chia sẻ xử lý tệp và các biến toàn cục. Đây sẽ là một đối số cho phương pháp 'trong cùng một quy trình', một đối số (nhỏ) khác là bạn chỉ nhận được một cửa sổ bật lên 'Tường lửa Windows' cho mỗi quy trình. Một lập luận cho cách tiếp cận 'quy trình khác nhau' là một người có thể chạy nhiều máy chủ mà không phải chạy nhiều máy khách. Điều này sẽ là lý tưởng cho một máy chủ chuyên dụng như thiết lập và là một cách tiếp cận chúng ta thường thấy trong các game bắn súng góc nhìn thứ nhất.

Bây giờ đối với ý tưởng có một quy trình máy chủ hoặc luồng ngay cả khi chơi ngoại tuyến (và thậm chí cho cả người chơi đơn), đây là một ý tưởng tuyệt vời được sử dụng rất nhiều trong thực tế. Bạn có thể nói rất nhiều trò chơi làm điều này bằng cách nhìn vào màn hình đang tải, những gợi ý nhỏ như 'nhận' sẽ cho nó đi. Thật hợp lý khi làm điều này vì nếu bạn định tạo nhiều người chơi, hầu hết các quy tắc trò chơi sẽ bị chi phối bởi máy chủ, vậy tại sao bạn không điều chỉnh chúng cho người chơi đơn? Điều này làm giảm mã bạn phải viết và phân tách rõ ràng hơn giữa máy khách và 'trò chơi' sẽ cải thiện chất lượng mã của bạn.

Bây giờ làm thế nào về giao tiếp giữa các quá trình và chủ đề? Giao tiếp quá trình chéo có thể được thực hiện bằng nhiều cách, (tên-), bộ nhớ dùng chung, COM, nó thực sự phụ thuộc vào công nghệ bạn đang sử dụng. Tuy nhiên, nếu bạn đang tạo một máy chủ, có lẽ bạn sẽ muốn sử dụng một biến thể kết nối mạng bằng cách sử dụng các ổ cắm và một cái gì đó tương tự như TCP, đây là điều tất nhiên khi LIDGREN sẽ có ích.

Rất nhiều trong số các kỹ thuật này cũng có giá trị cho giao tiếp xuyên chuỗi. Nhưng điều này phụ thuộc nhiều hơn vào các kỹ thuật bạn đang sử dụng. Bạn có thể một lần nữa đi với TCP, nhưng có lẽ một hệ thống thậm chí đơn giản hơn sẽ là các sự kiện và một số sự sắp xếp, mặc dù điều này có thể làm cho vòng lặp trò chơi của bạn không mang tính quyết định (2).

Nguồn

  1. Thiết kế và triển khai hệ điều hành (sách MINIX), ấn bản thứ 3 của Andrew S. Tanenbaum
  2. Khắc phục dấu thời gian của bạn bằng Glenn Fiedler: http://gafferongames.com/game-physics/fix-your-timestep/

1
Bổ sung duy nhất của tôi là nếu bạn muốn liên tục có máy khách cục bộ hoạt động với máy chủ cục bộ sử dụng cùng mã với máy khách từ xa và bạn muốn máy khách này sử dụng lại mã tương tự để kết nối với máy chủ từ xa mà bạn sẽ 1) sử dụng một quy trình cho máy chủ và 2) sử dụng mạng vì đây là mẫu số chung. Trừ khi bạn cảm thấy muốn viết hai phiên bản mã vận chuyển của mình, dù sao đi nữa =)
Patrick Hughes
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.