3.9.1 Деревья поведения в сравнении с иерархическими машинами состояния

В начале эпохи игрового программирования разработчики, как правило, использовали иерархические машины состояний, подобные SMACH. Основная сложность этих машин заключается в отслеживании всех переходов между состояниями. Добавление нового состояния или поведения к персонажу (или роботу) требует не только кодирования нового состояния, но и добавления переходов между всеми связанными состояниями. Вскоре диаграмма состояний игры начинает немного напоминать запутанные спагетти, что может затруднить её понимание и отладку.

Хотя деревья поведения внешне похожи на иерархические машины состояний, модульность их компонентов и простота их связей делают деревья поведения особенно простыми для программирования и понимания даже при работе со сложными играми или поведением. Ниже приведено дерево поведения, представляющее поведение нашего патрульного бота:

Деревья поведения разрушают сложные задачи, разветвляя их на набор условий и подзадач. Дерево всегда выполняется сверху вниз и слева направо. Для данного уровня дерева узлы слева имеют более высокий приоритет, чем узлы справа. В дереве, показанном выше, это означает, что ветвь дерева «СТОЯТЬ СПОКОЙНО» всегда будет запускаться перед ветвью «ПАТРУЛИРОВАТЬ». Аналогично, задача «ПРОВЕРЯТЬ БАТАРЕЮ» всегда будет выполняться перед поведением «ПОДЗАРЯДКА».

Поведения, или условия, находящиеся на дереве выше, такие как «стоять спокойно», более абстрактны, в то время как те, что находятся на более низких уровнях («перейдите к док-станции»), более конкретны. Фактически, только конечные узлы в каждой ветви дерева приводят к реальному поведению. Терминальные узлы, также известные как «листовые узлы», окрашены в красный цвет на диаграмме выше. Мы еще можем называть их «узлами действия». Синие узлы именуются «внутренними узлами» и представляют собой последовательности или другие составные модели поведения.

Самое важное различие между деревьями поведения и иерархическими машинами состояний заключается в том, что между поведениями на одном и том же уровне дерева никогда не существует прямых связей: любая связь между такими «родственными» поведениями может быть только косвенной в силу общих связей с поведениями более высокого уровня. Например, в SMACH версии робота для уборки дома, которую мы запрограммировали ранее, задачи «чистая ванна» и «мытье пола» в машине состояния ванной комнаты соединяются непосредственно друг с другом через переходы, такие как «когда ванна чистая, начните мыть пол». Такого рода боковые связи никогда не могут возникнуть в дереве поведения. Это означает, что отдельные модели поведения можно рассматривать как независимые модули и перемещать по дереву, не беспокоясь о разрыве боковых связей с другими моделями поведения.

Last updated