Version: 2017.3
空間マッピングの基本的な低レベル API 使用
Spatial Mapping コンポーネント

空間マッピングのベストプラクティス

空間マッピングで生成するデータ量と、そのデータを生成する速度とパフォーマンスに影響するため、低レベル API を使用する際には多くの問題を考慮する必要があります。

アプリケーションで空間マッピングの使用を慎重に計画しないと、アプリケーションの速度とパフォーマンスが低下する可能性があります。下に、空間マッピングが原因となるいくつかの潜在的な問題と、それらを回避する良い実践法を説明します。

問題: 衝突データの生成がとても遅い

空間マッピングのデータを生成する場合、衝突データの生成に、CPU 計算の大半が使用されます。 使用しない衝突データをリクエストすると、無駄に CPU リソースが拘束され、バッテリー寿命が短くなります。

回避方法

  • 必要な場合にのみ衝突データをリクエストします。不要なときの衝突データのリクエストを避けることにより、他の空間マッピングのリクエストの待ち時間が短縮され、バッテリー寿命が長くなります。
  • 最も重要な サーフェス のみをリクエストします。データのリクエストの優先順位を付けるには、サーフェス の更新時間とバウンディングボックスを使用します。

問題: 三角形の密度を高くすると、多数のジオメトリを生成する

RequestMeshAsync を通して サーフェス データをリクエストするときに、 SurfaceData 構造体trianglesPerCubicMeter を高い値に指定できます。こうすると、特に、散らかっているオフィスなど多くのオブジェクトがある空間では、非常に多くのジオメトリを生成します。ジオメトリが多いと、データ生成の待ち時間とメモリ使用量が増加します。さらに、メッシュの密度が高くなると、レンダリングや物理演算などのランタイムシステムの実行に、より時間がかかる場合があります。

回避方法

  • 空間マッピングデータに必要な最低限の解像度にします。生成するメッシュの解像度を低くすると、リクエストを処理するのに必要な CPU 時間が短縮されます。このようにすることで、消費電力が削減され、バッテリー寿命が長くなり、メッシュデータ生成の待ち時間が短縮されます。さらに、メッシュの解像度を低くすると、ランタイムのパフォーマンスに及ぼす負の影響が少なくなり、メモリにとってリソース負荷が少なくて済みます。これは、比較的単純なジオメトリが必要な物理演算のランタイム時に、特に当てはまります。

問題: メッシュのリクエストが多すぎると、不要な作業が行われる

Update が呼び出されると、SurfaceObservers はその範囲内の追加、更新、削除された サーフェス を報告します。

変更された サーフェス の全リストをワークキューに追加すると、サーフェス がシステムによって削除されてもワークキューに残ってしまいます。削除後に作業キューにまだ残っている サーフェス は、システム全体を移動しながら CPU 時間を使いますが、メッシュデータはなにも生成しません。これにより、待機中のリクエストの待ち時間が長くなります。

回避方法

  • 可能な場合は、ワークキュー内の サーフェス の数を制限します。メッシュのワークキューに関連付けられた長い待ち時間がある場合、一度に RequestMeshAsync を 1 つだけ使用してください。アプリケーションは、 サーフェス の報告された更新時間と範囲に基づいて、RequestMeshAsync の呼び出しの優先順位を決定します。
  • アプリケーションが最も重要なデータを最初に取得できるように、 サーフェス データのリクエストの優先順位を決定します。 この例として、以下が含まれます。
    • 既存の サーフェス の更新よりも、新しい サーフェス を優先します。
    • 離れた サーフェス よりも、近い サーフェス を優先します。

問題: 重なったり隣接した SurfaceObserver が同じメッシュを報告するため、RequestMeshAsync の呼び出しが重複して発生する

SurfaceObserver は、その範囲にあるすべての サーフェス の変更を報告します。サーフェス では複数の SurfaceObserver の範囲が重なること場合もあるので、アプリケーションのコードは同じ サーフェス を複数回リクエストすることがあります。

回避方法

  • SurfaceObserver すべてに対し 1 つのワークサブミットキューを使用します。多くの場合、1 つの SurfaceObserver で十分です。1 つだけを使用することによって、アプリケーションの複雑さが回避されます。ただし、複数の SurfaceObserver を必要とする 空間マッピング の高度な使用例がいくつかあります。このような場合は、すべての SurfaceObserver で 1 つのキューを使用して、メッシュリクエストを独自に優先順位付けします。
  • アプリケーションをより複雑にする必要がない場合は、SurfaceObserver は 1 つだけ使用します。

問題: SurfaceObserver を更新しても onSurfaceChanged コールバックを生成しない

このよくある問題は通常、設定の仕方が原因となっています。

回避方法

  • SetVolumeAsAxisAlignedBox などの関数を通して SurfaceObserver に有効な値が設定されていることを確認します。
  • Player SettingsPublishing Settings セクションで、Spatial Perception が有効になっていることを確認します。
空間マッピングの基本的な低レベル API 使用
Spatial Mapping コンポーネント