런타임 시 NavData 사용

NavData는 동일한 물리적 치수 및 이동 모델을 공유하는 캐릭터에 대해 일관된 NavData 세트를 유지하도록 담당하는 하나 이상의 Databases 오브젝트를 사용하여 런타임 시 게임에서 관리됩니다.

이 문서의 통합 튜토리얼을 이미 완료한 경우(게임 엔진에 Navigation 통합 참조) 런타임 시 NavData를 로드하고 언로드하는 기본적인 Database 사용에 익숙해지게 됩니다. 이 섹션의 다른 항목과 함께 이 페이지에서는 일부 추가 상세 정보 및 고려 사항을 제공합니다.

데이터베이스 만들기

World를 만들 때 World가 만들고 유지해야 하는 Databases 수를 지정해야 합니다. 통합 단계 1c: 월드 설정을(를) 참조하십시오.

Database는 동일한 구성 매개변수 세트로 만들어진 NavData만 로드할 수 있습니다. 물리적 치수 또는 이동 기능이 동일한 NavData를 공유할 수 없을 정도로 다른 캐릭터가 있는 경우 World에 대해 여러 Databases를 설정해야 합니다. 자세한 내용은 다중 데이터베이스 사용을(를) 참조하십시오.

World에서 유지되는 Databases 수는 World를 만든 다음에는 변경할 수 없습니다.

NavData를 메모리로 로드

지세 또는 지세의 섹터에 대한 NavData를 Database에 추가하려면 먼저 NavData 오브젝트를 만들고 파일 또는 메모리 버퍼에서 데이터를 읽어 데이터로 설정한 다음 그것을 관리하는 Database에서 초기화합니다.

파일에서 로드하는 방법을 보여주는 코드 예는 통합 단계 3: NavData 로드 및 언로드을(를) 참조하십시오.

메모리 버퍼에서 로드하는 방법을 보여주는 코드 예는 통합 단계 6a: 자산 파이프라인으로 NavData 통합을(를) 참조하십시오.

데이터베이스에서 NavData 추가 및 제거

경로 찾기, 경로 따르기 및 쿼리 시스템에 사용할 수 있도록 NavData를 Database에 추가하거나 게임에서 더 이상 필요하지 않아 Database에서 NavData를 제거하려는 경우 즉시 또는 비동기의 두 가지 방법 중에서 선택할 수 있습니다.

즉시

이 방법은 NavData를 추가하고 제거하는 가장 간단한 방법입니다. NavData 클래스의 다음 메서드를 사용합니다.

KyResult NavData::AddToDatabaseImmediate();
KyResult NavData::RemoveFromDatabaseImmediate();

이 접근 방식에서는 Database의 전체 업데이트가 즉시 시작되고 업데이트가 완료될 때까지 호출 스레드가 차단됩니다. 이 업데이트 동안 새 데이터가 기존 NavData로 완전히 연결되거나 나머지 NavData에서 완전히 분리됩니다.

이 접근 방식은 봇 및 쿼리에 사용할 수 있는 데이터에 최근의 추가 또는 제거 사항을 반영하여 언제나 최신 상태로 유지할 수 있다는 확실한 이점이 있습니다. 그러나 이 접근 방식은 현재 프레임 동안 전체 업데이트가 발생하기 때문에 실제 프로덕션에서 큰 데이터 세트가 함께 사용되는 경우 CPU 사용이 집중될 수 있습니다. 또한 다른 스레드에서 쿼리를 수행하는 경우 해당 쿼리가 의존하는 데이터를 수정하면 예상치 못한 결과 또는 충돌까지도 발생할 수 있기 때문에 멀티스레딩에 주의해야 합니다. 그러므로 이 방법은 초기 통합 및 프로토타이핑 단계 동안 주로 사용하기 위한 것이며 결국에는 데이터를 비동기로 추가하고 제거하게 됩니다.

그러나 데이터 생성 프로세스의 사후 처리 단계와 같이 게임 루프 컨텍스트 외부에서 데이터를 로드하는 경우에는 이 접근 방법을 사용해야 합니다.

비동기

NavData를 추가하고 제거하는 안전한 방법은 다음 메서드를 사용하는 것입니다.

KyResult NavData::AddToDatabaseAsync();
KyResult NavData::RemoveFromDatabaseAsync();

이 접근 방식에서는 NavData를 추가하거나 제거하기 위한 요청이 등록되고 World를 업데이트하는 동안 후속 프레임에서 처리됩니다.

  • 일단 비동기 Database 업데이트가 World 업데이트 동안 트리거되면 해당 WorldDatabase에서 NavData 추가 또는 제거를 위한 추가 요청은 업데이트가 완료된 후에만 처리됩니다. 따라서 비동기 추가 또는 제거를 요청하는 경우 Databases의 현재 상태에 따라 처리가 다음 프레임을 시작하거나 여러 프레임 동안 연기될 수 있습니다.
    주:이는 또한 최상의 성능을 위해 각 World에 대해 모든 추가 및 제거 요청을 그룹화하고 동일한 프레임에서 이들 모두를 요청해야 하는 것을 의미합니다.
  • Database에 있는 데이터의 현재 상태 및 관련된 계산의 복잡성(예: 고려해야 하는 NavMesh에 동적 수정을 유발하는 TagVolume 수)에 따라 처리가 단일 프레임에서 완료될 수도 있고 여러 프레임에서 시간 분할될 수도 있습니다.
  • 유일하게 보장되는 것은 최소 한 개의 프레임이 지나간 후에야 Database가 새로운 데이터 세트를 반영한다는 것입니다.

Database는 데이터 추가 및 제거 프로세스 추적과 관련된 모든 복잡한 요인을 관리합니다. 그러나 봇 및 쿼리가 Database에서 최신 NavData 세트 변경 사항을 사용하는지 알 수 있도록 요청 상태를 추적하는 것이 유용할 수 있습니다. 각 NavData 오브젝트는 NavData::m_databaseStatus를 통해 액세스할 수 있는 자체 상태 값을 유지하며 이를 통해 할당된 Database에서 해당 NavData의 현재 상태를 나타냅니다.

다음 이미지는 추가 및 제거 요청에 대한 응답에서 이러한 상태 값이 설정되는 방법을 요약한 것입니다. 상태 값은 빨간색으로, 사용자가 시작한 동작은 검은색으로, 내부 동작은 파란색으로 표시됩니다.

메모리에서 NavData 언로드

Database에서 NavData 오브젝트를 제거한 다음에는 언제나 해당 NavData 오브젝트에 대해 유지한 포인터를 KY_NULL로 설정해야 합니다. 이를 통해 참조 계산 메커니즘이 감소됩니다.