Bỏ qua phản ứng. Trên mạng LAN, ping không đáng kể. Trên internet, chuyến đi khứ hồi 60-100ms là một điều may mắn. Hãy cầu nguyện với các vị thần tụt hậu mà bạn không nhận được các đột biến> 3K. Phần mềm của bạn sẽ phải chạy với số lượng cập nhật / giây rất thấp vì đây là một vấn đề. Nếu bạn quay trong 25 cập nhật / giây, thì bạn đã có thời gian tối đa 40ms giữa khi bạn nhận được một gói và hành động theo nó. Và đó là trường hợp đơn luồng ...
Thiết kế hệ thống của bạn cho sự linh hoạt và chính xác. Đây là ý tưởng của tôi về cách nối một hệ thống con mạng vào mã trò chơi: Nhắn tin. Giải pháp cho rất nhiều vấn đề có thể là "nhắn tin". Tôi nghĩ rằng nhắn tin đã chữa khỏi bệnh ung thư ở chuột thí nghiệm một lần. Nhắn tin giúp tôi tiết kiệm 200 đô la trở lên trong bảo hiểm xe hơi của tôi. Nhưng nghiêm túc, nhắn tin có lẽ là cách tốt nhất để gắn bất kỳ hệ thống con nào vào mã trò chơi trong khi vẫn duy trì hai hệ thống con độc lập.
Sử dụng nhắn tin cho bất kỳ liên lạc nào giữa hệ thống con và công cụ trò chơi và cho vấn đề đó giữa bất kỳ hai hệ thống con nào. Nhắn tin giữa các hệ thống con có thể đơn giản như một đốm dữ liệu được truyền bởi con trỏ bằng std :: list.
Đơn giản chỉ cần có một hàng đợi tin nhắn gửi đi và một tham chiếu đến công cụ trò chơi trong hệ thống con mạng. Trò chơi có thể kết xuất các tin nhắn mà nó muốn gửi vào hàng đợi và gửi chúng tự động, hoặc có lẽ khi một số chức năng như "flushMessages ()" được gọi. Nếu công cụ trò chơi có một hàng đợi tin nhắn chia sẻ lớn, thì tất cả các hệ thống con cần gửi tin nhắn (logic, AI, vật lý, mạng, v.v.) đều có thể đổ tin nhắn vào đó trong đó vòng lặp trò chơi chính có thể đọc tất cả các tin nhắn và sau đó hành động phù hợp.
Tôi sẽ nói rằng chạy các ổ cắm trên một chủ đề khác là tốt, mặc dù không bắt buộc. Vấn đề duy nhất với thiết kế này là nó thường không đồng bộ (bạn không biết chính xác khi nào các gói được gửi) và điều đó có thể gây khó khăn cho việc gỡ lỗi và làm cho các vấn đề liên quan đến thời gian xuất hiện / biến mất một cách ngẫu nhiên. Tuy nhiên, nếu được thực hiện đúng cách, cả hai điều này sẽ không thành vấn đề.
Từ cấp độ cao hơn, tôi muốn nói mạng riêng biệt từ chính công cụ trò chơi. Công cụ trò chơi không quan tâm đến ổ cắm hoặc bộ đệm, nó quan tâm đến các sự kiện. Sự kiện là những thứ như "Người chơi X đã nổ súng" "Một vụ nổ tại trò chơi T đã xảy ra". Những điều này có thể được giải thích bởi công cụ trò chơi trực tiếp. Chúng được tạo từ đâu (một kịch bản, hành động của khách hàng, trình phát AI, v.v.) không quan trọng.
Nếu bạn coi hệ thống con mạng của mình như một phương tiện gửi / nhận sự kiện, thì bạn sẽ nhận được một số lợi thế so với việc chỉ gọi recv () trên một ổ cắm.
Ví dụ, bạn có thể tối ưu hóa băng thông bằng cách lấy 50 tin nhắn nhỏ (có độ dài 1-32 byte) và để hệ thống con mạng gói chúng thành một gói lớn và gửi nó. Có lẽ nó có thể nén chúng trước khi gửi nếu đó là một vấn đề lớn. Mặt khác, mã có thể giải nén / giải nén gói lớn thành 50 sự kiện riêng biệt một lần nữa để công cụ trò chơi đọc. Tất cả điều này có thể xảy ra trong suốt.
Những thứ hay ho khác bao gồm chế độ trò chơi một người chơi sử dụng lại mã mạng của bạn bằng cách có một máy khách thuần túy + một máy chủ thuần túy chạy trên cùng một máy giao tiếp qua tin nhắn trong không gian bộ nhớ dùng chung. Sau đó, nếu trò chơi một người chơi của bạn hoạt động đúng, một máy khách từ xa (tức là nhiều người chơi thực sự) cũng sẽ hoạt động. Ngoài ra, nó buộc bạn phải cân nhắc trước những dữ liệu nào cần thiết cho khách hàng vì trò chơi một người chơi của bạn sẽ có vẻ đúng hoặc sai hoàn toàn. Trộn và kết hợp, chạy máy chủ VÀ trở thành khách hàng trong trò chơi nhiều người chơi - tất cả đều hoạt động dễ dàng như vậy.