내비게이션 메시 생성 속도 최적화하기

내비게이션 메시의 생성 속도를 최적화하는 방법에 대한 하우투 가이드입니다.

Choose your operating system:

Windows

macOS

Linux

이 가이드의 최신 버전은 로컬에 설치한 언리얼 엔진의 다음 디렉터리에서 찾을 수 있습니다. Engine\Source\Runtime\NavigationSystem\DevDocs\How To Optimize Navmesh Generation.md

개요

언리얼 엔진의 내비게이션 시스템(Navigation System) 은 인공 지능 에이전트에게 경로 탐색 기능을 제공합니다. 시작 위치와 목적지 사이의 경로를 찾기 위해 내비게이션 메시(Navigation Mesh) 가 월드 콜리전 지오메트리에서 생성됩니다.

내비게이션 메시는 런타임에서 내비게이션 메시의 일부분을 재생성할 수 있도록 타일로 분할됩니다.

내비게이션 시스템은 고급 사용자가 레벨 내에서 내비게이션이 계산되는 방식을 수정하는 데 사용할 수 있는 여러 세팅을 제공합니다. 이 가이드에서는 내비게이션 메시의 생성 속도를 최적화하기 위한 권장 사항을 알아봅니다.

셀 크기와 셀 높이를 가능한 한 크게 지정하기

셀 크기(Cell Size)셀 높이(Cell Height) 프로퍼티는 내비게이션 타일을 생성할 때 사용되는 복셀의 크기를 정의합니다. 복셀이 작을수록 정밀도가 높아지고 장애물 주변의 내비게이션이 더 정확해집니다. 그러나 복셀이 작을수록 런타임에서 내비게이션 메시를 재생성할 때 더 많은 프로세싱이 필요합니다.

따라서 프로젝트에 필요한 셀(복셀)의 크기와 내비게이션 정밀도 간의 균형을 잘 잡는 것이 중요합니다.

내비게이션 메시의 셀 크기 및 셀 높이 프로퍼티를 조정하려면 다음 단계를 따릅니다.

  1. 세팅(Setting) > 프로젝트 세팅(Project Settings) 을 클릭하여 프로젝트 세팅 창을 엽니다.

    프로젝트 세팅 창을 엽니다

  2. 내비게이션 메시(Navigation Mesh) 섹션으로 이동하여 생성(Generation) 섹션으로 내려갑니다. 셀 크기셀 높이 값을 키우면 생성 속도가 개선됩니다. 크기 및 높이 값이 커지면 레벨 내 내비게이션 메시의 정밀도는 낮아진다는 점에 유의하세요.

    프로젝트 세팅 창을 엽니다

  3. 또는 아웃라이너(Outliner) 에서 RecastNavMesh-Default 액터를 선택하고 디테일(Details) 패널에서 레벨 내의 내비게이션 메시를 개별적으로 조정할 수도 있습니다.

    월드 아웃라이너 창에서 내비메시 액터를 선택합니다

  4. 이 예시에서는 셀 크기(Cell Size)19 에서 64 로 변경했습니다. 정밀도가 낮아져서 레벨 내 오브젝트 주변의 내비게이션 메시가 덜 정확해진 것을 볼 수 있습니다. 새 셀 크기가 64이므로 벽과 박스 사이에 내비게이션이 생성되지 않습니다. 아래 이미지의 화살표가 가리키는 부분을 참고하세요.

타일 크기 19

타일 크기 64

권장 사항

에이전트에 필요한 정밀도를 유지하는 선에서 셀을 최대한 크게 만드세요.

위 예시에서는 셀 크기(Cell Size) 를 64로 설정하자 벽과 박스 사이의 경로가 제거되었습니다. 이 경로가 에이전트에게 필요하다면, 경로가 생성될 때까지 셀 크기 를 조정해도 되고 박스를 벽에서 더 멀어지도록 이동해도 됩니다.

타일 크기 제한하기

내비게이션 메시는 런타임에서 내비게이션 메시의 일부분을 재생성할 수 있도록 타일로 분할됩니다. 각 타일은 여러 셀로 만들어지므로 내비게이션 타일(Navigation Tile)을 재생성하면 모든 셀이 새 콜리전 정보로 재생성됩니다.

타일이 클수록 셀이 더 많이 들어가고 재생성 비용도 작은 타일보다 높아집니다. 그러나 시스템이 타일을 프로세스할 때는 타일 에지에 인접한 다른 셀들을 함께 프로세스합니다. 타일 크기를 설정할 때는 이 오버헤드 비용을 고려해야 합니다. 다수의 작은 타일을 프로세스하는 오버헤드 비용이 큰 타일 하나를 재생성하는 비용보다 높을 수 있기 때문입니다.

권장 사항

타일 크기(Tile Size) 는 한 면당 32 ~ 128개 셀 로 설정해야 합니다. 그렇게 하면 런타임에서 타일을 재생성할 때 최고의 퍼포먼스가 나옵니다.

이전 예시에서는 셀 크기64 로 설정했습니다. 그 경우 타일 크기 UU(Tile Size UU)2048 (64*32) ~ 8192 (64*128) 사이로 설정해야 합니다.

타일 크기 UU 설정

메시에 간소화된 콜리전 사용하기

내비게이션 시스템은 각 오브젝트의 콜리전 데이터를 사용하여 내비게이션 메시를 생성합니다. 오브젝트 콜리전이 단순할수록 트라이앵글 수가 많은 콜리전 데이터에 비해 프로세스가 빠릅니다.

권장 사항

가능하다면 스태틱 메시(Static Mesh)에는 단순 콜리전(Simple Collision) 을 사용하세요. 콜리전 메시에 사용되는 트라이앵글 수가 적을수록 생성이 빨라집니다.

내비게이션 메시에 영향을 미치는 오브젝트 수 줄이기

레벨 내의 블루프린트 액터(Blueprint Actor)와 스태틱 메시(Static Mesh)는 기본적으로 내비게이션에 영향을 줍니다. 내비게이션 타일에 영향을 미치는 오브젝트의 수는 타일을 생성하는 비용과 직결됩니다.

권장 사항

내비게이션 메시에 영향을 미치지 않아야 할 작은 오브젝트는 내비게이션에 영향을 미치지 않도록 환경설정해야 합니다. 레벨에서 액터를 선택하고 디테일(Details) 패널로 이동합니다. 콜리전(Collision) 섹션으로 스크롤을 내려서 Can Ever Affect Navigation 체크박스를 비활성화 합니다.

액터에서 내비게이션을 비활성화합니다

레벨 내 액세스 불가능한 위치에서 움직이는 오브젝트 등 내비게이션 메시에 영향을 미치지 말아야 할 모든 액터에서는 이 세팅을 비활성화해야 합니다.

그리고 가급적 대규모 타일 영역이나 다수의 타일에 동시에 영향을 미치지 말아야 합니다.

내비게이션 생성 관리에 유용한 개발자 툴

전략적인 시간에 내비게이션 메시 생성을 잠금 및 잠금 해제하기

내비게이션 메시에 영향을 줄 수 있는 다수의 에셋을 로드하기 전에 내비게이션 메시의 자동 생성을 중지할 수 있습니다. 모든 에셋이 완전히 로드된 뒤에 생성을 잠금 해제할 수 있습니다. 이 메서드는 내비게이션 시스템이 동일한 타일을 여러 번 재생성하지 않도록 방지합니다.

내비게이션 메시 생성을 잠그려면 내비게이션 시스템의 bInitialBuildingLockedTrue 로 설정합니다. 생성을 잠금 해제하려면 ReleaseInitialBuildingLock() 함수를 호출합니다. 잠금 해제되면 내비게이션 메시는 로드된 에셋으로 인해 더티로 표시된 모든 타일을 재생성할 것입니다. 이를 방지하려면 생성을 잠금 해제하기 전에 DefaultDirtyAreasController.Reset() 을 호출합니다.

멀티 스레드 내비게이션 메시 생성 활성화하기

내비게이션 시스템에서 MaxSimultaneousTileGenerationJobsCount 프로퍼티를 설정하여 멀티 스레드 내비게이션 메시 생성을 제어할 수 있습니다. 이 기능은 FRecastNavMeshGenerator::Init() 내의 총 작업 스레드 수에 의해 제한된다는 점에 유의하세요.

완전히 다이내믹한 내비게이션 메시를 생성하는 동적 장애물 사용하기

레벨 내의 스태틱 메시 및 기타 액터를 동적 장애물(Dynamic Obstacles) 로 표시할 수 있습니다. 동적 장애물은 생성이 재생성되어야 하는 내비게이션 메시 표면을 표시합니다. 그러면 내비게이션 타일(Navigation Tile) 전체가 재생성되지는 않습니다.

이 메서드는 전체 내비게이션 타일을 생성하는 것보다 비용이 낮습니다. 내비게이션 메시 표면이 움직이는 장애물에는 필요하지 않은 경우에 사용해야 합니다.

스태틱 메시를 동적 장애물로 설정합니다

서브레벨에 로드된 스태틱 내비게이션 메시에 데이터 청크 스트리밍 사용

내비게이션 메시가 오직 서브레벨의 로딩과 언로딩으로만 변경된다면, 다이내믹 내비게이션 메시를 사용하는 대신 내비게이션 메시의 생성 메서드를 Static 으로 변경하고 내비메시 데이터 청크 스트리밍(NavMesh Data Chunk Streaming) 을 사용할 수 있습니다.

이 메서드를 사용하면 내비게이션 메시가 에디터에서 완전히 구축되고, 런타임에서는 연관성이 있는 부분만 로드됩니다.

태그