Я працював на тому ж двигуні, що і кодерангер. Я маю різні точки зору. :)
По-перше, у нас не було стека FSM - у нас був стек штатів. Стек штатів складає єдину FSM. Я не знаю, як виглядатиме стопка FSM. Напевно, занадто складно, щоб робити щось практичне.
Моя найбільша проблема з нашою Глобальною державною машиною полягала в тому, що це була група штатів, а не набір штатів. Це означає, наприклад, ... / MainMenu / Завантаження було іншим, ніж ... / Завантаження / MainMenu, залежно від того, чи було у вас головне меню до або після завантажувального екрана (гра асинхронна і завантаження здебільшого керується сервером ).
У якості двох прикладів речей це стало потворним:
- Це призвело, наприклад, до стану LoadingGameplay, тому для завантаження в стані Gameplay був Base / Loading, Base / Gameplay / LoadingGameplay, який повинен був повторити велику частину коду в звичайному стані завантаження (але не все, і додати ще трохи ).
- У нас було кілька функцій на кшталт "якщо в творці персонажів перейти до геймплея; якщо в геймплейі перейти до вибору символів; якщо у виборі символів повернутися до входу", тому що ми хотіли показати ті самі вікна інтерфейсу в різних станах, але зробити Назад / Вперед кнопки все ще працюють.
Незважаючи на назву, вона була не дуже "глобальною". Більшість внутрішніх ігрових систем не використовували його для відстеження внутрішніх станів, оскільки вони не хотіли, щоб їхні стани спілкувалися з іншими системами. Інші, наприклад, система користувальницького інтерфейсу, могли використовувати її, але лише для копіювання стану у власні місцеві державні системи. (Я б особливо застерігсь від системи для штатів інтерфейсу користувача. Стан користувальницького інтерфейсу - це не стек, це дійсно DAG, і намагаючись змусити будь-яку іншу структуру на ньому збиратися зробити лише користувацькі інтерфейси, які засмучують використання.)
Це було добре - виділити завдання інтеграції коду від інфраструктурних програмістів, які не знали, як ігровий потік насправді структурований, так що ви можете сказати хлопцеві, який пише патч, "поставив свій код у Client_Patch_Update", а хлопець написав графіку завантажуючи "помістіть свій код у Client_MapTransfer_OnEnter", і ми зможемо без особливих проблем помінятися певними логічними потоками.
У побічному проекті мені пощастило з набором штатів , а не стеком , не побоюючись зробити кілька машин для споріднених систем, і відмовився дозволити собі потрапити в пастку "глобальної держави", що насправді просто складний спосіб синхронізації речей за допомогою глобальних змінних - Звичайно, ви все одно зробите це в якийсь термін, але не плануйте це як свою мету . По суті, стан у грі не є стеком, а стани в грі не всі пов'язані.
GSM, як правило, покажчики функцій та нелокальна поведінка, ускладнювали налагодження речей, хоча налагодження таких великих переходів у державі було не дуже цікавим, перш ніж у нас це було. Набори держав замість державних стеків насправді це не допомагають, але ви повинні знати про це. Віртуальні функції, а не покажчики функцій, можуть дещо полегшити це.