Loại bỏ các chu kỳ MUD thông thường


7

Tôi đang làm việc trên một công cụ MUD và tôi muốn làm điều đó một chút khác biệt sau đó tất cả các trò chơi MUD tôi đã chơi. Tôi thấy một hệ thống "chu kỳ" rất nhàm chán. Một trong những ý tưởng tôi có là làm cho mọi socket khách hàng hoạt động trong Thread của riêng chúng. Tôi biết rằng nó sẽ không kết thúc với hàng trăm người chơi nhưng tôi muốn biết liệu có vấn đề gì khi tạo ra "rất nhiều" chuỗi trong một quy trình không.

Hoặc, chiến lược nào khác tôi có thể sử dụng nếu tôi muốn thực hiện nó (ví dụ: chiến đấu) trong "thời gian thực".

Tôi hy vọng các bạn hiểu câu hỏi.

Cảm ơn bạn.

Câu trả lời:


14

Các chu kỳ MUD thường không có vì máy chủ gặp sự cố khi xử lý mọi thứ trong thời gian khả dụng hoặc phục vụ các yêu cầu mạng đủ nhanh. Chúng ở đó bởi vì các lệnh spam càng nhanh càng tốt nên không phải là một chiến thuật hợp lệ.

Đơn giản chỉ cần có một thời gian hồi chiêu / sạc lên liên kết với mỗi khả năng. Tùy thuộc vào thiết kế xã hội của bạn, điều này cũng có thể bao gồm "di chuyển" và "nói" hoặc không.

Nói chung, có nhiều hơn một luồng trên mỗi lõi để xử lý mạng trong trò chơi là vô nghĩa. Nếu bạn bị ràng buộc xử lý gói, thì một luồng trên mỗi lõi sẽ tối đa hóa hệ thống của bạn - nhiều luồng sẽ chỉ bỏ đói những thứ khác về thời gian CPU mà chúng cần. Nếu bạn không bị ràng buộc xử lý gói, một luồng trên mỗi lõi đủ nhỏ để nó không ảnh hưởng đến phần còn lại của hệ thống thông qua quá nhiều chuyển đổi ngữ cảnh.


Chính xác những gì người này nói :)
tốc

3
Chết tiệt ... Dù sao, tôi đã thấy một lần MUD không có chu kỳ, và nó bị hút, bởi vì một số người chơi sẽ tạo ra một số macro vĩ đại hơn trên máy khách của họ, và khi bạn đến PvP với họ, họ sẽ dễ dàng làm bạn chết vì tuyệt đối chỉ huy lũ lụt, ngay cả khi chúng yếu hơn, đôi khi chúng sẽ đánh bạn nhiều lần trước khi bạn có cơ hội đọc những gì đang diễn ra.
tốc

Hmm Tôi thấy điểm đó nhưng thêm các lệnh khác nhau vào độ trễ bên trong (lệnh chiến đấu 3 giây, chuyển động cho phép nói 2 giây và mạng xã hội 1) Tôi tin rằng nó sẽ khắc phục vấn đề đó. Các văn bản trận chiến khác sẽ liên tục hiển thị. Một số người chơi sẽ đánh nhiều hơn / nhanh hơn tùy theo chỉ số của họ. Đó là suy nghĩ của tôi về những gì tôi muốn làm
Cybrix

đó là ý tưởng đằng sau toàn bộ sự việc Tôi chỉ không thể tìm ra nếu tất cả chạy trong cùng một chủ đề. Nó trông giống như một vòng lặp lớn đối với tôi để xem liệu có người chơi nào có lệnh đệm và sau đó thực thi nó không. Nhưng còn các lệnh tấn công thông thường (tương tự như "sát thương trắng" trong WoW) thì sao?
Cybrix

Chạy cập nhật logic trò chơi của bạn ở một số FPS cố định, ví dụ 30. Thiệt hại xảy ra cứ sau 2 giây xảy ra cứ sau 60 khung hình. Nó chỉ là một vòng lặp trò chơi bình thường, nhưng không có lệnh gọi render ().

5

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ô!


2

Bạn có thể cho phép các lệnh chiến đấu khi chúng đến và sau đó thêm thời gian trễ sau các lệnh dựa trên thời gian chúng sẽ thực hiện.

Dragonrealms sử dụng phương pháp này để chiến đấu cũng như nhiều hành động khác, nó được gọi là Roundtime there. Vũ khí nặng hơn có được thời gian lớn hơn và bạn có thể giảm nó, nhưng không loại bỏ nó bằng sức mạnh và sự nhanh nhẹn.


Đó chính xác là ý tưởng của tôi đằng sau. Nhưng tôi nghĩ rằng tôi sẽ lái nó với các khách hàng đa luồng. Nhưng bây giờ tôi nghe thấy nó không phải là một gợi ý gợi ý hay: P
Cybrix

Tại sao sử dụng các chủ đề vượt quá những gì bạn có thể sử dụng cho ổ cắm / giao tiếp?
lathomas64

0

Mạng là bản chất nối tiếp dù sao (ít nhất là cho đến khi bạn đi vào đường truyền cáp quang đa Tbps). Có một luồng cho I / O mạng tách biệt với logic trò chơi và có thể một số luồng tác nhân tự trị có ý nghĩa. Mọi thứ khác là quá mức cần thiết.


Nếu bạn có máy đa lõi, tôi sẽ giới thiệu nhiều hơn một luồng mạng (tối đa một cho mỗi lõi); trong khi mỗi ổ cắm bị giới hạn mạng, việc đọc các yêu cầu của máy khách và xây dựng các gói phản hồi trạng thái trò chơi / RPC để đưa trở lại vào các ổ cắm là gần như hoàn toàn song song.
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.