[게임] Behavior Tree VS FSM

알감자·2022년 3월 17일
0

게임공부

목록 보기
2/22

1. FSM이란?

  • Finite State Machine, 유한 상태 기계

  • 유한한 개수의 상태들로 구성된 하나의 간단한 기계

  • 캐릭터의 행동을 각 상태로 모듈화.
    캐릭터의 행동 추가/삭제에 대해 어느 정도 유연함을 가지고 있는 편

  • 하지만 State를 나누기가, Transition을 리와이어링 하기가 매우 어렵다. (State가 늘어나면 늘어날수록!)

  • 확장이 제한된다.

  • HFSM(Hierarchical Finite State Machine)을 사용하여 문제점을 보완할 수 있지만 유지 보수 코스트는 여전히 높다.

  • 콘솔 게임에서는 온라인 게임보다 AI가 훨씬 더 중요한 요소 -> FSM이 부적합



2. 그래서 나온 것이 BT

  • BT(Behavior Tree)란 사실은 HFSM을 보다 일반화한 것
  • 계층적으로 State를 나누어가는데 집중
  • 트리 탐색형 명령 체계로 일반화

구조적인 장점

  • 단순한 하부 구조
  • Divide & Conquer로 작업을 쪼개기 쉬움
  • 모듈 재활용이 용이, 읽기 쉽고 유지보수 간편
  • visual Tool 제작이 용이
  • BT 구조를 그대로 플래닝에 활용할 수 있음

주의할 점

  • BT 노드의 탐색 순서가 행동에 영향을 미친다
  • BT 노드는 서로간에 의존성이 없어야 한다
  • BT 노드는 Blackboard나 게임 오브젝트에서 정보를 얻어와야 한다.

출처 : https://www.slideshare.net/yonghakim900/2009-ndc

Blackboard

  • Blackboard란 : 의사결정을 위해 데이터를 쓰고 읽을 수 있는 간단한 장소
    • Blackboard는 단일 AI Pawn에서 사용하거나, 분대(squad)에서 공유하거나, 관련 데이터를 검색할 수 있는 중앙 장소(central place)가 있는 편리한 다른 용도로 사용할 수 있다.
    • Blackboard는 일반적으로 BT와 함께 사용되지만, 편의상 BT와 별도로 사용하거나 Blackboard가 필요 없는 BT를 만들 수 있다.
  • Blackboard를 사용하는 이유
    1) 효율적인 Event-Driven 동작을 만들기 위해
    : Blackboard를 변경하면 값을 확인하기 위해 모든 프레임을 업데이트할 필요 없이 BT의 흐름을 변경하는 이벤트가 발생할 수 있다.


    2) To Cache Calculations
    : 계산 되어야하는 일부 데이터들은 반복해야 하거나 단순히 성능 면에서 비용이 많이 들 수 있다. 따라서 BT 전체에서 사용할 수 있도록 계산된 값을 Cache하여 반복하여 다시 계산할 필요가 없도록 하는 것이 좋다.
    그렇게 한다면 값을 계산하는 빈도가 낮아지고 오류 발생률도 낮아진다. 데이터를 두 곳 이상에서 재계산할 경우 실수로 다르게 계산될 수 있다.


    3) As a scratch-pad for behaviors
    : BT에서 사용해야 하는 일부 데이터에는 다른 명확한 home이 없다.
    예를 들어 시퀀스를 시작할 때 BT의 다른 부분이 시퀀스에 끼어들지 않도록 시퀀스를 시작했음을 note하고 싶을 수 있다. 그러나 이 순서는 이미 어딘가에 저장되어 있는 특정 클래스나 지식과 쉽게 동일하지 않을 수 있다. 이 경우 Context Override*를 사용하여 값을 설정 및 clear할 수 있다.

    • Context override는 BT의 구현에서 특수한 동작 유형 트리 노드이다.
    • Context override는 특정 동작이 시작될 때 값을 설정하고 어떤 이유로든 동작이 종료되면 값을 이전 값으로 복원한다.

    4) 데이터 집중화
    : Blackboard는 데이터를 중앙 집중화하고 데이터의 출처에 대한 추가 지식이 필요하지 않은 좋은 방법이다. Blackboard가 없으면 다양한 클래스에 저장된 정보를 쿼리하기 위해 여러 단계를 거쳐야 하는 경우가 많다.

  • 모든 것을 Blackboard에 복사하지 않는 이유

  1. Blackboard에 많은 super-specific-data를 채우지 마라.
    하나의 노드만 알아야 하는 경우 트리의 모든 비트를 조사하는 동안 검토해야 할 값을 하나 더 추가하는 대신 값 자체를 가져올 수 있다.
  1. 데이터를 Blackboard에 제대로 복사하지 못하면 디버깅 악몽이 생길 수 있다! 값을 소스만 또는 Blackboard만 보고 있는 경우, 두 값이 다를때 문제가 발생하고 있음을 즉시 깨닫지 못할 수 있다.

  2. 충분한 값을 자주 업데이트하여 Blackboard에 계속 복사해야 하는 경우 성능이 저하될 수 있다.

출처 : https://forums.unrealengine.com/t/blackboard-documentation/1795

0개의 댓글