Làm thế nào để bạn cho phép mã mạng được viết trong các giai đoạn sau của sự phát triển?


12

Tôi hiện đang trong giai đoạn đầu viết một trò chơi mà cuối cùng tôi sẽ muốn cải thiện ở hầu hết các khía cạnh.
Làm thế nào tôi có thể bỏ qua việc viết mã mạng mà vẫn để nó được thực hiện khá dễ dàng, nghĩa là không phải viết lại toàn bộ trò chơi chỉ để thêm nó.
Tôi phải ghi nhớ điều gì?

Tôi có một mẫu thành phần nơi tôi tách biệt vật lý / phát hiện va chạm, logic trò chơi, kiểu dữ liệu và hoạt hình / kết xuất với nhau.
Làm cách nào để tôi viết một máy khách và máy chủ không có mã mạng nào được triển khai nhưng có thể được kiểm tra cục bộ?
Tôi nên làm gì trong máy khách và tôi nên làm gì trong máy chủ? Tôi có nên sắp xếp giả vờ rằng tôi đã hoàn thành mã mạng và gửi tin nhắn giữa máy chủ và máy khách và tài khoản cho sự chậm trễ, vv mặc dù sẽ không có gì?

Chỉnh sửa: Nó được lên kế hoạch để trở thành một game nhập vai từ trên xuống. Nhiều người chơi đơn giản nơi bạn lưu trữ một máy chủ cho bạn bè là những gì tôi nghĩ, vì vậy gian lận không phải là vấn đề lớn (ai muốn chơi với bạn bè gian lận?). Vẫn muốn đi với một "Máy chủ luôn luôn đúng" -approach.

Chỉnh sửa 2: Tôi đoán tôi đang tìm kiếm một số gợi ý về tâm trí của tôi nên như thế nào. Làm thế nào tôi nên xử lý đầu vào bàn phím, hoạt hình, vv, thay vì chỉ áp dụng mọi hiệu ứng / thay đổi ngay lập tức. Hmmm, tôi có thể cần phải đọc đúng trên mạng trước khi đi bất cứ nơi nào, đó là những gì tôi đã hy vọng thoát khỏi bằng cách tạo ra một bộ xương mạng có thể hoạt động cục bộ.


Điều đó phụ thuộc rất nhiều vào cách bạn dự định thực hiện mã mạng của mình sau khi bạn đến đó. Quake (hoặc một số tiêu đề id sau này có thể, bộ nhớ của tôi hơi mờ), ví dụ, đã sử dụng phương pháp luôn là máy khách / máy chủ. Ngay cả tùy chọn một người chơi thực sự đang kết nối với máy chủ ở 127.0.0.1 và không mời người chơi khác - có nghĩa là ngay cả trò chơi một người chơi cũng chạy hoàn toàn thông qua mã mạng.
LLL79

Đó là những gì tôi đã nghĩ trong đầu. Có thể một số giao tiếp giữa các quá trình để bạn không cần kết nối khi bạn muốn chơi một mình hoặc có thể một lớp có chức năng tương tự như máy khách nhưng xử lý nó giống như máy chủ ngay lập tức.
Ghork

3
Cách thực hành tốt nhất là "không" trong một thời gian. Trừ khi bạn đang viết một trò chơi theo lượt, bạn chỉ cần thiết kế mọi thứ khác nhau để xử lý kết nối mạng. Nếu bạn quan tâm đến độ trễ, tính chính xác và gian lận, đơn giản là không có cách nào khác. Nếu bạn không, bạn thực sự không cần phải suy nghĩ nhiều về điều đó - nếu bạn không có kinh nghiệm, dù sao bạn cũng sẽ không dự đoán đúng thiết kế phù hợp. Cách tốt nhất là bắt đầu với một vài nguyên mẫu được nối mạng để có được trải nghiệm kết nối mạng, thực sự.
Luaan

Nếu bạn nghĩ về nó, minecraft có một máy chủ cục bộ ngay cả trong các trò chơi một người chơi. Máy chủ là động cơ, khách hàng chỉ là người trình bày.
Spark

Câu trả lời:


12

Không biết thêm về trò chơi chính xác mà bạn đang viết và cách bạn viết nó, rất khó để nói các giải pháp chung cho vấn đề của bạn.

Tuy nhiên, bạn có thể muốn xem xét quyết định này khi đưa mã mạng đến hết, tùy thuộc vào mức độ quan trọng của mạng đối với trò chơi của bạn.

Ý tôi là, nếu bạn đang viết một game nặng mạng, chẳng hạn như MMORPG, có thể không khôn ngoan khi để kết nối mạng đến cùng.

Điều đó được xem xét, nếu tác động mà bạn mong đợi đối với mã mạng thấp (như trong, hoàn toàn không có mã mạng không phải là công cụ phá game), thì có thể nên để nó ở giai đoạn muộn hơn (nhưng không quá muộn).

Hãy nhớ rằng - viết - mã mạng không giống như - nghĩ về nó. Khi bạn đưa ra quyết định về cách trò chơi của bạn được thực hiện, bạn nên xem xét điều này sẽ ảnh hưởng đến quyết định kết nối mạng như thế nào và nếu tác động dự kiến ​​cao, có thể thực hiện nó như một sơ khai cung cấp một số thông tin chung, và sau đó là lúc viết mạng mã, nó chỉ là một vấn đề cắm nó vào nơi bạn rời cuống.

Vì vậy, ví dụ, nếu bạn đang thực hiện một trò chơi cờ vua trực tuyến, bạn có thể có một chức năng ExecuteMove()được gọi theo cách nào đó khi di chuyển được nhập bằng chuột và theo một cách khác khi di chuyển được nhập bằng bàn phím. Tại thời điểm này, bạn có thể muốn nghĩ về việc tạo một cuống mạng, sau khi nhận được dữ liệu cần thiết từ máy chủ khác (đây là những gì bạn viết ở phần sau), hãy gọi ExecuteMove().

Bằng cách đó, khi bạn tạo trò chơi của mình, bạn sẽ biết phần nào bị ảnh hưởng bởi mã mạng và khi đến lúc thực sự viết mã mạng, bạn sẽ đi trước một vài bước.

Nếu đây là lần đầu tiên bạn viết một trò chơi nối mạng, hãy cân nhắc không suy nghĩ quá nhiều về việc chống gian lận và những thứ như vậy. Làm một trò chơi nối mạng đủ phức tạp để yêu cầu toàn bộ đội ngũ những người có kinh nghiệm cao làm điều đó cho một trò chơi AAA, vì vậy hãy chơi chậm và trước tiên hãy tạo một trò chơi hoạt động, trước khi tập trung vào các chủ đề phức tạp hơn.

Cuối cùng, nếu đây là lần đầu tiên bạn làm một trò chơi, đừng làm cho nó được nối mạng, làm ơn. Làm một trò chơi rất phức tạp, đến mức mỗi yêu cầu bạn thêm vào trò chơi của bạn sẽ khiến nó trở nên phức tạp hơn theo cấp số nhân.


Chà, nó không phải là MMO nên sẽ không quá nặng nề trên mạng. Tuy nhiên, đây không phải là một trò chơi cờ cũ, nơi bạn có thể mất vài giây trước khi di chuyển được thực hiện. Tôi cảm thấy việc kết nối mạng nên được nghĩ đến sớm bởi vì, theo kinh nghiệm của tôi, việc thêm nhiều người chơi ở giai đoạn cuối sẽ không hiệu quả. Tuy nhiên tôi không muốn viết mã mạng và gỡ lỗi trước khi tôi có thể khiến nhân vật của mình di chuyển và va chạm với các vật thể.
Ghork

2
@Ghork: Ah, bạn muốn thấy sản phẩm của mình làm những điều đẹp nhất càng sớm càng tốt! Vâng, vâng, tất cả chúng ta làm. Nhưng không chịu nổi sự cám dỗ đó sẽ không dẫn đến một chương trình được thiết kế tốt và chu đáo.
Cuộc đua nhẹ nhàng với Monica

Tôi sẽ chấp nhận câu trả lời này, mặc dù tôi cũng thích các câu trả lời khác. Cụ thể là bình luận của @Luaan
Ghork 20/07/2015

2

Tôi đang ở trong một tình huống tương tự, nhưng tôi đang cố gắng thực hiện một mô phỏng nối mạng hơn là một trò chơi; nhưng tôi nghĩ rằng cách tiếp cận của tôi có thể giúp quá trình thiết kế của bạn.

Cách tiếp cận của tôi là dọc theo dòng nhận xét của bạn về IPC (giao tiếp giữa các quá trình).

Đầu tiên, làm nền tảng tôi đang nghiên cứu cuốn sách "Đồ họa nối mạng" của Steed và Oliveira. Điều này cung cấp một nền tảng tốt về các kiến ​​trúc mạng khác nhau cho các trò chơi tùy thuộc vào các tiêu chí và loại trò chơi khác nhau. Nó cung cấp một công cụ để giúp bạn quyết định kiến ​​trúc trò chơi của bạn và chính xác những gì bạn muốn đưa vào mạng và những gì bạn muốn xảy ra cục bộ.

Thứ hai, tách các thành phần mạng thành một luồng nền riêng biệt để quá trình phát triển trò chơi ban đầu của bạn có thể được mã hóa thành phần cục bộ, nhưng bạn buộc phải xử lý việc tách luồng. Không kết hợp chúng với bất kỳ tính năng nào khác mà sau này sẽ là "nền cục bộ" mà buộc chúng thành các luồng nền "có khả năng từ xa".

Điều này sẽ giúp tách biệt logic của bạn và cũng cho phép bạn mô phỏng các yếu tố trễ mạng vào quy trình để bạn cũng có thể thấy tác động của độ trễ.


Đoán tôi sẽ phải kiểm tra cuốn sách đó sau đó! Nghe có vẻ hứa hẹn có thể làm những gì bạn nói.
Ghork

@Ghork: Điều quan trọng là tìm ra kiến ​​trúc của bạn, những gì bạn muốn cục bộ và những gì bạn muốn trên một máy chủ; hoặc cách bạn muốn đồng nghiệp giao tiếp và tương tác. Cuốn sách đó sẽ giúp. Sau đó đặt mọi thứ bạn muốn từ xa ở phía bên kia của một cuộc gọi tin nhắn IPC thông qua một bộ mã máy chủ-máy khách mà bây giờ tất cả vẫn ở chế độ cục bộ nhưng giữ các nội dung "từ xa" trên các luồng riêng biệt. Trong thành phần chuyển thông điệp IPC, thêm một cách giả tạo bất kỳ độ trễ nào bạn muốn mô phỏng. Chúc may mắn!
Joe Van Steen

1

Nếu bạn đang tìm hiểu về tất cả những thứ này, tại sao không viết Phiên bản 1 người chơi đơn giản, và một khi nó hoạt động, với kiến ​​thức sâu hơn của bạn, hãy suy nghĩ lại toàn bộ nội dung sâu sắc cho Phiên bản 2 sẽ là nhiều người chơi?


0

Triển khai lớp "mạng giả" chuyển các tin nhắn giữa các luồng, có giao diện giống như lớp mạng sẽ có. Sau đó, bạn có thể xây dựng mạng giả để có sự chậm trễ ngẫu nhiên và mất gói. Sẽ luôn dễ dàng hơn để gỡ lỗi mã mạng với lớp giả so với mạng thật.

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.