흑기사 방랑일지 ahden's DevNote

상태머신 vs. 비헤이비어트리

상태머신(State Machine)

장점

단순하다. 상태들과 상태간 전이만 있을 뿐이다. 아주 단순하고 직관적이어서 어디든 상태와 해당 상태에 대한 처리가 필요할 때에 쉽게 만들 수 있다.

단점

단순하고 쉽지만, 규모가 커져서 상태가 많아지고 상태 간 전이 많아지면 그 복잡도는 상상을 초월할 수 없이 커진다.

왜 복잡해질까

직접 만들어본 사람이면 알겠지만, 상태머신의 가장 큰 문제는 복잡하게 얽혀있는 상태전이 연결선에서 비롯된다. 어떤 객체는 하나의 상태로 출발한다. 그런데 주변 환경은 이 객체를 그냥 가만두지를 않는다. 다양한 환경조건이 변화함에 따라서, 적절히 객체의 상태도 변화하게 되는 것이다. 이러한 상태변화의 조건체크와 그에 상응하는 변화할 상태를 정의하는 것이 상태전이 연결선이다. 백지에서 상태머신을 구상했을 때를 기억해보자. 아마 처음에는 아주 깔끔한 각 상태에 대한 정의와 깔끔히 연결된 모습을 상상하게 되지만, 실제 구현을 하고 수정을 반복하다 보면 점점 처음에 구상했던 이상적인 모습에서 멀어지게 된다. 조건은 언제든지 새로 추가될 수 있고, 그 조건을 만족했을 때에 변화될 새로운 상태는 얼마든지 추가될 수 있는 것이 현실이다. 그래서 상태와 연결선은 점점 불어나게 된다.

극단적인 예를 살펴보자. 만약 객체가 X라는 슈퍼 조건을 만족하면, 어떤 상태이던지 상관없이 상태A로 전이되는 상황을 상상해보자. 아무리 작업자가 이쁘게 만들어놓은 상태머신 그래프라 해도 어쩔 도리가 없다. 전체 상태 개수-1개 만큼의 전이를 만들어야 할 것이며, (안그래도 개수가 많아서 추가하는 작업도 번거로운데) 작업을 마치고 난 후의 그래프 비주얼을 보면 바로 현타가 올 것이다. 극단적인 예를 들었지만, 대부분 비슷하다. 조건은 하나 추가했을 뿐이지만, 현재 객체 상태가 너무 다양해서 특정 상태로 가게 하려면, 여러 상태에서 하나의 상태로 가기 위해 많은 전이를 만들어야 하는 것이다.

비헤이비어트리(Behavior Tree)

비헤이비어트리(BT)는 앞서 언급한 상태머신의 단점을 해소시켜준다. 비헤이어트리는 트리를 순회하면서 조건에 따른 행동을 결정한다. 각 노드는 조건에 따라 분기하고 최종적으로 행동 노드(리프)에 도달하면 행동한다.

장점

상태머신에 비해서 독해가 쉽다. 트리 순회 방향을 따라 가기만 하면 되기 때문이다. (물론, 트리가 너무 커지면 장점은 희석된다. 그래도 상태머신에 비하면 낫다.) BT는 조건이 주도하고 결과로서 행동을 하는 구조이기 때문에, 적절한 조건에 맞게 동일한 행동 노드를여러군데 트리노드로 추가할 수 있는 구조이다. 따라서 앞서 상태 머신이 유일한 상태들 간에 부가적으로 조건에 의한 전이를 추가해야 하는 것에 비해 가독성 면에서 더 좋다. 다시 말하면, BT는 조건에 따라 행동을 적재적소에 추가하는 것이 가능한데 비해, 상태머신은 여러 조건에 대해서 (행동을 위한) 유일 상태로 가야 하므로 비주얼 구조가 복잡하다.

단점

장점만 있는 것은 아니다. 역시 제일 큰 단점은 순회비용일 것이다. 트리를 효율적으로 구성하지 못하면, 틱마다 트리의 순회비용이 매우 높아질 수 있다. 또한 비헤이비어 트리 역시도 노드가 많아지고 그 깊이가 깊어지기 시작하면 보기싫을 정도로 복잡해 질 수 있음을 유의해야 한다.