Version: 2018.2
공간 매핑 저수준 API
Unity XR 입력(Unity XR Input)

공간 매핑의 일반적인 문제 해결

공간 매핑은 대용량 데이터를 생성하므로 애플리케이션의 속도와 성능에 영향을 미칩니다. 이 섹션에서는 공간 매핑을 사용할 때 발생할 수 있는 일반적인 문제들과 그러한 문제들을 방지하는 방법을 살펴보겠습니다.

충돌 데이터 생성에 시간이 많이 소요되는 문제

충돌 데이터 생성은 다른 공간 매핑 작업보다 CPU 처리 시간이 더 오래 걸립니다. 필요할 때만 충돌 데이터를 요청하도록 하면 CPU 사용률을 최적화하고 배터리 사용 시간을 늘릴 수 있습니다.

베스트 프랙티스 솔루션

  • 필요할 때만 충돌 데이터를 요청하십시오. 필요하지 않은 경우 충돌 데이터를 요청하지 않으면 다른 공간 매핑 요청에 대한 지연 속도가 줄어들고 배터리 사용 시간을 늘릴 수 있습니다.

  • 표면(Surface) 의 업데이트 시간과 바운딩 박스를 사용하여 데이터 요청에 우선 순위를 지정하고, 우선 순위가 높은 표면 만 요청하십시오.

삼각형의 밀도가 높아 많은 지오메트리를 생성하는 문제

RequestMeshAsync 메서드를 사용하여 표면(Surface) 데이터를 요청할 때 SurfaceData 구조체를 통해 설정되는 trianglesPerCubicMeter의 높은 값은 씬에서 매우 많은 지오메트리를 생성합니다. 씬에 많은 지오메트리가 생성되면 데이터 생성 지연 시간과 애플리케이션의 메모리 사용량이 증가합니다. 씬의 메시 밀도가 높아도 렌더링, 물리 등과 같은 런타임 시스템의 속도가 저하되어 성능에 영향을 줄 수 있습니다.

베스트 프랙티스 솔루션

애플리케이션에 필요한 공간 매핑 데이터의 최소 해상도를 사용하십시오. 이렇게 하려면 애플리케이션과 생성된 공간 매핑 메시의 정확도를 테스트해야 하지만, 정확도와 성능 간에 균형이 잡히므로 궁극적으로는 훨씬 더 긍정적인 사용자 경험을 제공할 수 있습니다. 생성되는 메시의 해상도를 낮추면 메시가 업데이트될 때 애플리케이션의 CPU 처리 시간을 단축할 수 있습니다. 또한 디바이스의 전력 소모를 낮추고 배터리 시간을 늘릴 뿐만 아니라 메시 데이터 검색 시 지연 시간을 줄일 수 있습니다. 또한 저해상도 메시는 메모리 사용량이 적고 렌더링, 물리 등과 같은 런타임 시스템(복잡도가 낮은 지오메트리를 예상함)에 미치는 영향이 더 적습니다.

너무 많은 메시 요청을 대기열에 추가하여 불필요한 작업이 수행되는 문제

SurfaceObserversSurfaceObserver.Update 메서드를 호출할 때 볼륨에서 모든 추가, 업데이트 및 제거된 표면(Surfaces) 을 보고합니다.

그러면 변경된 표면 의 전체 리스트가 작업 대기열에 추가되고, 이로 인해 표면 이 공간 매핑이 제거한 후에도 작업 대기열에 남아 있을 수 있습니다. 이러한 표면 은 여전히 시스템을 통과하며 CPU 처리 시간을 늘리지만, 아무런 메시 데이터를 생성하지 않습니다. 이로 인해 대기 중인 요청의 지연 속도가 늘어나게 됩니다.

베스트 프랙티스 솔루션

작업 대기열의 표면 수를 최대한 제한하십시오. 메시 쿼리는 지연 시간이 길고 성능 소모가 크기 때문에 한 번에 하나의 RequestMeshAsync 요청만 사용하도록 만들면 이로 인해 발생하는 속도 저하를 최소화할 수 있습니다. 애플리케이션은 표면 의 보고된 업데이트 시간 및 바운드를 사용하여 RequestMeshAsync 호출에 우선 순위를 지정합니다.

또한 표면 데이터 요청의 우선 순위를 지정하여 애플리케이션이 가장 중요한 데이터를 먼저 받아야 합니다. 일반적인 우선 순위 지정 방법은 다음을 예제를 참조하십시오.

  • 기존 표면 업데이트보다 새로운 표면 에 더 높은 우선 순위를 부여합니다.

  • 사용자로부터 멀리 떨어진 것보다 가까이 있는 표면 에 더 높은 우선 순위를 부여합니다.

SurfaceObserver 볼륨 오버랩으로 인해 중복 RequestMeshAsync 호출이 생성되는 문제

SurfaceObservers는 볼륨 오버랩을 일으키는 모든 표면 변화를 보고합니다. 여러 표면 이 서로 가까이 붙어 있으면 SurfaceObserver 볼륨이 여러 번 오버랩될 수 있습니다. 이 경우 애플리케이션 코드가 동일한 표면 을 여러 번 요청하게 되어 성능 저하가 발생하게 됩니다.

베스트 프랙티스 솔루션:

SurfaceObserver의 요청에 대해 단일 작업 제출 대기열을 사용하십시오.

대부분의 애플리케이션에서 하나의 SurfaceObserver면 충분할 때가 많습니다.

단일 SurfaceObserver를 사용하면 애플리케이션 개발 복잡도를 줄일 수 있습니다. 하지만 여러 SurfaceObserver 멤버가 필요한 공간 매핑(Spatial Mapping) 등과 같은 고급 사용법도 있습니다. 이 경우에는 씬의 모든 SurfaceObserver 멤버에 단일 작업 대기열을 사용해야 메시 요청에 고유한 우선 순위를 지정할 수 있습니다.

SurfaceObserver를 업데이트해도 onSurfaceChanged 콜백이 생성되지 않는 문제

이는 아주 흔한 문제로, 대개 설정 프로세스가 잘못되었을 때 발생합니다.

베스트 프랙티스 솔루션

SetVolumeAsAxisAlignedBox 등과 같은 메서드를 사용하여 SurfaceObserver에 유효한 볼륨을 설정하십시오.

또한 퍼블리싱 설정(Publishing Settings) (메뉴: 파일(File) > Build Settings(빌드 설정) > 플레이어 설정(Player Settings) > 퍼블리싱 설정(Publishing Settings)) 에서 공간 인식(Spatial Perception) 기능을 활성화해야 합니다.

WMR용 기능 및 퍼블리싱 설정에 대한 자세한 내용은 Unity의 Windows Mixed Reality 빠른 시작 가이드를 참조하십시오.

  • 2018–05–01 편집 리뷰를 거쳐 페이지 게시됨

  • Unity 2017.3에서 HoloLens 공간 매핑에 대한 설명이 업데이트됨

공간 매핑 저수준 API
Unity XR 입력(Unity XR Input)