Làm thế nào để tôi mã hóa hiệu quả cả máy khách và máy chủ cùng một lúc?


15

Tôi đang mã hóa trò chơi của mình bằng mô hình máy khách-máy chủ. Khi chơi trên một người chơi, trò chơi sẽ khởi động một máy chủ cục bộ và tương tác với nó giống như một máy chủ từ xa (nhiều người chơi). Tôi đã làm điều này để tránh mã hóa riêng phần chơi đơn và mã nhiều người chơi.

Tôi mới bắt đầu viết mã và đã gặp phải một vấn đề lớn. Hiện tại tôi đang phát triển trò chơi trong Eclipse, có tất cả các lớp trò chơi được tổ chức thành các gói. Sau đó, trong mã máy chủ của tôi, tôi chỉ sử dụng tất cả các lớp trong các gói máy khách.

Vấn đề là, các lớp máy khách này có các biến đặc trưng cho kết xuất, điều này rõ ràng sẽ không được thực hiện trên máy chủ.

Tôi có nên tạo các phiên bản sửa đổi của các lớp máy khách để sử dụng trong máy chủ không? Hoặc tôi chỉ nên sửa đổi các lớp máy khách bằng boolean, để cho biết liệu máy khách / máy chủ của nó có sử dụng nó không. Có lựa chọn nào khác tôi có không? Tôi chỉ có một suy nghĩ về việc có thể sử dụng lớp máy chủ làm lớp lõi, sau đó mở rộng nó với công cụ kết xuất?


Bạn có tùy chọn tiền xử lý? Giống như #ifdef CLIENT <một số mã> #endif. Đó là một cách đơn giản để chia sẻ các tệp lớp, có thể khác nhau giữa máy chủ và máy khách và chia sẻ các phần. Mặc dù có một chút lộn xộn.
William Mariager

Tôi đồng ý với MindWorX. Mặc dù biên dịch có điều kiện là một nỗi đau trong Java, có những giải pháp nên được xem xét.
sam hocevar

1
Biên dịch có điều kiện là một cách thô thiển để nói "Tôi đã không đặt đủ thời gian thiết kế vào các gói của mình", theo ý kiến ​​của tôi =) "Một chút lộn xộn" thường được dịch thành "Cái quái này làm gì?" sáu tháng sau khi bạn đọc lại ngay cả mã của chính mình và phản tác dụng cho bất cứ thứ gì ngoại trừ các nguyên mẫu vứt đi.
Patrick Hughes

Câu trả lời:


23

Bạn nên giữ mã kết xuất của bạn tách biệt với logic trò chơi của bạn , vì chúng là những mối quan tâm riêng biệt .

Nếu bạn tách mã kết xuất của mình khỏi mã máy khách / máy chủ, bạn sẽ nhận được một số lợi thế:

  • Tạo một máy chủ chuyên dụng sẽ dễ dàng hơn, vì bất kỳ mã nào được kết xuất sẽ ở một nơi.
  • Bạn có thể tách updatepha của bạn khỏi pha của bạn rendervà chạy chúng ở các dấu thời gian khác nhau.
  • Bạn có thể đảm bảo mã kết xuất của mình không làm thay đổi trạng thái trò chơi, bằng cách sử dụng const, giảm lỗi.

1
+1 Tôi không thể đồng ý với tình cảm này nhiều hơn. Việc tách mô hình dữ liệu khỏi các chế độ xem được hiển thị của mô hình đó sẽ cho phép bạn thực hiện mọi thứ gọn gàng như nhiều cửa sổ hiển thị thông tin khác nhau, chuyển kết xuất sang các nền tảng khác, thêm phân tích và điều chỉnh mô phỏng của bạn để chơi trò chơi mà không cần phải chạm 90% cơ sở mã của bạn .
Patrick Hughes

5

Tôi nghĩ bạn nên tách riêng mã máy khách và máy chủ. Mã máy chủ và mã máy khách không nên biết về nhau ngoại trừ chức năng được hiển thị với giao diện. Máy chủ không cần biết bất cứ điều gì về kết xuất, chỉ cần đăng ký khách hàng, theo dõi vị trí, thời gian, v.v. Nếu bạn có mối quan tâm tách biệt rõ ràng, việc duy trì và phát triển trò chơi của bạn sẽ dễ dàng hơn. Mong cái này giúp được chút ít.


+1 Tôi có xu hướng đồng ý với điều này. Nếu máy chủ sẽ chạy bất kỳ máy khách nào, thì nó sẽ làm như các quy trình riêng biệt.
Kỹ sư

5

Tách các mối quan tâm FTW, như những người khác đã nói, nhưng nếu mục tiêu cuối cùng của bạn là có các ứng dụng máy khách và máy chủ riêng biệt, bạn cần phải tiến thêm một bước. Bạn cần xác định cái gì là dành riêng cho khách hàng, cái gì là dành riêng cho máy chủ và cái gì được chia sẻ. Đối với mọi thứ được chia sẻ, hãy tách nó thành các lớp mã được chia sẻ riêng; Các lớp khách hàng hoặc máy chủ cụ thể sau đó có thể phân lớp hoặc tham chiếu các lớp dùng chung nếu thích hợp. Chuyển các lớp được chia sẻ thành một dự án riêng biệt, xây dựng JAR "thư viện chia sẻ" và bao gồm JAR đó trong cả các dự án máy khách và máy chủ.

Điều này có một vài lợi thế: nó làm cho sự tách biệt các mối quan tâm trở nên rõ ràng để giữ mọi thứ trong các dự án riêng biệt; nó đảm bảo với bạn rằng máy khách và máy chủ đang bắt đầu với cùng một mã được chia sẻ (miễn là chúng sử dụng cùng một phiên bản của JAR được chia sẻ); và nó làm cho không thể "vô tình" sửa đổi mã được chia sẻ mà không nhận ra nó. Nếu mã được chia sẻ nằm trong dự án riêng của nó, bạn sẽ biết khi bạn chỉnh sửa bất cứ thứ gì trong dự án đó mà bạn cần biết về những thay đổi sẽ ảnh hưởng đến cả máy khách và máy chủ.

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.