Tôi đã làm việc trên cùng một động cơ như coderanger. Tôi có một quan điểm khác nhau. :)
Đầu tiên, chúng tôi không có một đống FSM - chúng tôi có một chồng trạng thái. Một chồng các trạng thái tạo ra một FSM duy nhất. Tôi không biết một đống FSM sẽ trông như thế nào. Có lẽ quá phức tạp để làm bất cứ điều gì thực tế với.
Vấn đề lớn nhất của tôi với Bộ máy Nhà nước Toàn cầu của chúng tôi là đó là một tập hợp các trạng thái chứ không phải là một tập hợp các trạng thái. Điều này có nghĩa là, ví dụ, ... / MainMothy / Đang tải khác với ... / Đang tải / MainMothy, tùy thuộc vào việc bạn có bật menu chính trước hay sau màn hình tải không (trò chơi không đồng bộ và việc tải chủ yếu do máy chủ điều khiển ).
Như hai ví dụ về những điều này làm cho xấu xí:
- Nó dẫn đến trạng thái LoadingGameplay, do đó bạn có Base / Loading và Base / Gameplay / LoadingGameplay để tải trong trạng thái Gameplay, phải lặp lại nhiều mã ở trạng thái tải bình thường (nhưng không phải tất cả, và thêm một số nữa ).
- Chúng tôi đã có một số chức năng như "nếu trong trình tạo nhân vật đi đến chơi trò chơi nút vẫn hoạt động.
Mặc dù tên, nó không phải là "toàn cầu". Hầu hết các hệ thống trò chơi nội bộ đã không sử dụng nó để theo dõi trạng thái nội bộ của họ, vì họ không muốn trạng thái của họ bị chế nhạo với các hệ thống khác. Những người khác, ví dụ hệ thống UI, có thể sử dụng nó nhưng chỉ để sao chép trạng thái vào hệ thống trạng thái cục bộ của chính họ. (Tôi đặc biệt thận trọng đối với hệ thống đối với các trạng thái UI. Trạng thái UI không phải là một ngăn xếp, nó thực sự là một DAG và cố gắng ép buộc bất kỳ cấu trúc nào khác trên đó sẽ chỉ tạo ra các UI gây khó chịu khi sử dụng.)
Điều tốt cho việc cô lập các tác vụ để tích hợp mã từ các lập trình viên cơ sở hạ tầng là những người không biết cách thức dòng chảy thực sự được cấu trúc, vì vậy bạn có thể nói với anh chàng viết bản vá "đặt mã của bạn vào Client_Patch_Update" và anh chàng viết đồ họa đang tải "đặt mã của bạn vào Client_MapTransfer_On Entry" và chúng tôi có thể trao đổi một số luồng logic nhất định xung quanh mà không gặp nhiều rắc rối.
Trong một dự án phụ, tôi đã may mắn hơn với một bộ trạng thái chứ không phải là một ngăn xếp , không ngại tạo ra nhiều máy cho các hệ thống không liên quan và từ chối để mình rơi vào cái bẫy có "trạng thái toàn cầu", đó thực sự là chỉ là một cách phức tạp để đồng bộ hóa mọi thứ thông qua các biến toàn cục - Chắc chắn, bạn sẽ kết thúc việc đó gần thời hạn, nhưng đừng thiết kế với mục tiêu đó . Về cơ bản, trạng thái trong trò chơi không phải là một chồng và các trạng thái trong trò chơi không liên quan đến nhau.
GSM cũng vậy, vì các con trỏ chức năng và hành vi phi cục bộ có xu hướng làm, khiến việc gỡ lỗi trở nên khó khăn hơn, mặc dù việc gỡ lỗi các loại chuyển đổi trạng thái lớn đó cũng không thú vị trước khi chúng ta có nó. Các bộ trạng thái thay vì ngăn xếp trạng thái không thực sự giúp ích cho việc này, nhưng bạn nên biết về nó. Các hàm ảo thay vì các con trỏ hàm có thể làm giảm bớt phần nào điều đó.