Xin lỗi về sự cần thiết của luồng, nhưng vấn đề này là dự án thú cưng FAVORITE của tôi để học và dạy các mô hình và khung đồng thời!
Chạy mọi máy khách / mob trong luồng riêng của chúng sẽ tạo ra sự phân chia tự nhiên, nhưng vì một số luồng đã lưu ý là đắt khi bạn sử dụng nhiều hơn so với lõi CPU. Nếu đây không phải là lý do thuyết phục để không sử dụng nó trong MUD của bạn, thì đó vẫn là một lý do tốt để tìm hiểu một cách tốt hơn.
Chạy tất cả các máy khách trong một vòng lặp trò chơi thời gian cố định duy nhất, với các hành động thực hiện một số vòng lặp, là một phương pháp quen thuộc trong thế giới trò chơi đồ họa. Nó không ràng buộc mọi thứ trên thế giới vào cùng một chu kỳ thời gian, mặc dù việc tạo ra các vòng đủ hạt mịn có thể che lấp điều đó. Hạn chế chính của phương pháp này, như tôi thấy, là nó không phải là song song. Ai đó lưu ý rằng bạn có thể tạo các luồng để giảm tải xây dựng / phân tích cú pháp / thu phát I / O, chạy AI và tiếp tục với các luồng khác, nhưng để logic trò chơi chính song song đòi hỏi một sự thay đổi cơ bản và rất nhiều công việc để giữ cho mọi thứ an toàn.
Nếu bạn đã làm tất cả công việc đó, có lẽ bạn sẽ kết thúc với thứ gì đó giống với mô hình Diễn viên yêu thích hiện tại của tôi, http://en.wikipedia.org/wiki/Actor_model ). Mô hình Actor là một chiến lược chia sẻ thời gian, kết thúc khá gần với những gì bạn đang đề xuất với ý tưởng một luồng cho mỗi khách hàng. Sử dụng nó, bạn mã hóa "Diễn viên" của mình giống như các luồng độc lập, với một vài hạn chế: chúng phải được điều khiển theo sự kiện và chúng chỉ có thể giao tiếp với phần còn lại của hệ thống bằng cách gửi tin nhắn (khác nhau nhưng đơn giản). Bit điều khiển sự kiện nhường chỗ cho thời gian thực sự độc lập của bạn, bằng cách lên lịch các sự kiện dành riêng cho diễn viên để kích hoạt vào những thời điểm cụ thể, ví dụ: khi một hành động được hoàn thành hoặc ở một tần số cụ thể của khách hàng.
Trong triển khai, việc triển khai sử dụng một hàng đợi (hoặc hàng đợi) các tin nhắn được tạo bởi tất cả các tác nhân và một nhóm các luồng khớp với các lõi CPU của bạn. Các luồng kéo các tin nhắn ra khỏi hàng đợi và gọi các phương thức xử lý tin nhắn của Actor để xử lý chúng, chạy trong ngữ cảnh của Actor đó cho đến khi tin nhắn được "xử lý". Theo quan điểm của bạn, mỗi Actor có luồng riêng của mình bất cứ khi nào nó thực sự chạy, nhưng theo quan điểm của hệ thống, chỉ có nhiều luồng như có CPU để chạy chúng.
Có một số khung Actor tuyệt vời ngoài kia, cụ thể là Erlang / OTP và Akka, nhưng ý tưởng cơ bản đủ đơn giản để bạn có thể thực hiện nó trong bất kỳ ngôn ngữ nào mà không cần thêm sự phức tạp của khung.
Để hoàn thiện, mô hình Actor thực sự chỉ là sự kết hợp giữa truyền thông điệp để đảm bảo an toàn cho luồng, lập trình hướng sự kiện cho đồng thời và cơ chế gửi luồng. Nếu bạn đã loại bỏ các bit gửi luồng, bạn sẽ bị bỏ lại với một hệ thống "phản ứng", rất thịnh hành cho khả năng mở rộng nói chung ngay bây giờ (xem http://www.reactivemanifesto.org/ ). Sau đó, bạn có thể ánh xạ thực thi tới nhiều máy trong một đám mây hoặc bất cứ điều gì ... bạn hiểu ý tưởng ... đó là tất cả để nói rằng dự án lập trình MUD của bạn có thể dạy cho bạn các kỹ năng lập trình thị trường. Hoan hô!