空間マッピングの低レベル API
Unity XR Input

空間マッピングのよくあるトラブルシューティングの問題

空間マッピングは大量のデータを作成し、使用します。これはアプリケーションのスピードとパフォーマンスに影響を与えます。ここでは、空間マッピングを用いることでよく発生する問題と、それを回避する方法に関して説明します。

衝突データの作成に時間がかかる

衝突データの作成は、空間マッピングの中で最も CPU 処理時間を必要とします。必要な場合にのみ衝突データを要求することで、CPU リソースの使用が最適化されバッテリー寿命も向上します。

回避方法

  • 必要な場合にのみ衝突データを要求します。これにより、他の空間マッピングの要求の待ち時間が短縮され、バッテリー寿命が長くなります。

  • サーフェス の Update time とバウンディングボックスを使ってデータの要求に優先順位を付け、優先順位が高い サーフェス のみを要求します。

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

サーフェス データを要求するときに、SurfaceData 構造体の trianglesPerCubicMeter を高い値に設定すると、非常に多くのジオメトリをシーンに生成します。これは特に、オブジェクトが多く含まれる空間 (混みあったオフィスなど) で顕著です。シーンに多くのジオメトリがあると、データ生成の待ち時間とアプリケーションのメモリ使用量が増加します。さらに、シーン内のメッシュの密度が高くなると、パフォーマンスに影響を及ぼし、レンダリングや物理演算などのランタイムシステムの実行に、より時間がかかる場合があります。

回避方法

アプリケーションに必要な空間マッピングデータの最小解像度を設定してください。これを行うには、アプリケーションと生成された空間マッピングメッシュの正確さをテストする必要があります。ただし、結果的に、良いユーザー体験を生み出すためには、正確さとパフォーマンスのバランスが必要です。生成されたメッシュの解像度が低いと、メッシュの更新時にアプリケーションが費やす CPU 時間が少なくなります。 これにより、デバイスの消費電力を削減し、バッテリー寿命を延ばし、メッシュデータを取得する際の待ち時間も短縮します。低解像度メッシュは、メモリ使用量も少なく、レンダリングや物理計算などのランタイムシステムへの影響も少なくなります (複雑度の低いジオメトリを想定) 。

メッシュの要求が多すぎると、不要な作業が行われる

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

これにより、変更された サーフェス の全てがワークキューに追加され、空間マッピングがそれらを削除したあとに使用しない サーフェス がワークキューに残ってしまいます。削除後にワークキューにまだ残っている サーフェス は、システムを移動するときに CPU 時間を使いますが、メッシュデータに全く反映されません。これにより、待機中の要求の待ち時間が長くなります。

回避方法

可能な場合は、ワークキュー内の サーフェス の数を制限するよう注意します。メッシュをクエリすることは、長い待ち時間を伴う高負荷な操作です。そのため、1 度に RequestMeshAsync を 1 回だけ呼び出することによって、この待ち時間を減少することができます。アプリケーションは、 サーフェス の報告された更新時間と範囲に基づいて、RequestMeshAsync の呼び出しの優先順位を決定します。

サーフェス データの要求の優先順位を決定することも大切です。そうすれば、もっとも重要なデータを最初に受け取ることができるからです。優先順位をつけるもっとも一般的な例は以下の通りです。

  • 既存の サーフェス の更新よりも、新しい サーフェス を優先します。

  • 奥にある サーフェス よりも手前にあるものを優先します。

SurfaceObserver の範囲が重なると RequestMeshAsync の呼び出しが重複する

SurfaceObserver は、該当範囲にあるすべての サーフェス の変更を報告します。サーフェスSurfaceObserver の範囲が互いに近くにあるとき、複数の範囲に含まれる場合があります。そのため、コードによって同じ サーフェス が複数回要求され、パフォーマンスの問題になる場合があります。

回避方法

SurfaceObserver からの要求には単一のワークキューを使います。

多くのアプリケーションでは、1つの SurfaceObserver だけあれば必要十分であることがほとんどです。

1つの SurfaceObserver を使用すると、アプリケーション開発の複雑さを軽減する助けとなります。ただし、 空間マッピング の高度な使用例の中には、複数の SurfaceObserver を必要とするものもあります。このような場合は、シーンのすべての SurfaceObserver で 単一のワークキューを使用して、メッシュ要求を独自に優先順位付けします。

SurfaceObserver を更新しても onSurfaceChanged コールバックが発生しない

これはよく見られる問題で、大抵、設定に問題があります。

回避方法

SetVolumeAsAxisAlignedBox などのメソッドを使い、SurfaceObserver に有効な範囲を設定します。

また、Publishing Settings (File > Build Settings > Player Settings > Publishing Settings) で忘れずに Capability リストの Spatial Perception をオンにしてください。

Windows の複合現実 (Mixed Reality、MR) の Capability と Publishing Settings に関して詳しくは、Unity の WMR quick start guide を参照してください。

  • 2018–05–01 編集レビュー を行ってパブリッシュされたページ

  • Hololens の空間マッピングは 2017.3 に更新

空間マッピングの低レベル API
Unity XR Input