Hiromuブログ

最近はこちら(https://zenn.dev/hiromu)が本体

Azure Remote Rendering ドキュメントメモ

www.hiromukato.com

上の記事はハンズオンを中心とした内容でしたが、今回は概要やコンセプトに関するドキュメントの内容をサマリ(というより自分が気になった部分を抜き出したもの)としてまとめました。

概観/特徴

  • レンダリングのデバッグ

    • サーバ側のレンダリングフレーム、ポリゴン数、ワイヤフレーム表示ができる
  • Late Stage Reprojection (LSR)

    • ユーザーが移動したときにホログラムを安定させるのに役立つハードウェア機能
    • 基本的には Depth LSR を選択する
  • ライト

    • キャストシャドウ(光に照らされた物体によって生じる、別の物体の上に落ちる影)は現在対応していない
  • 片面レンダリング

    • 片面レンダリングは実験的な機能なので今後削除される可能性がある
  • 空間クエリ

    • すべての空間クエリはサーバーで評価される
    • 空間クエリは、ユーザーが指しているオブジェクトを特定するなど、対話を実装するために頻繁に使用される
    • 空間クエリは Havok Physics エンジンを利用しており、専用のコリジョンメッシュが必要
    • コリジョンメッシュは、デフォルトではモデル変換時に生成される
  • Zファイティングの緩和

    • Azure Remote Rendering には z-fighting 緩和機能がある
  • サーバー側のパフォーマンスクエリ

    • サーバーでの優れたレンダリングパフォーマンスは、安定したフレームレートと優れたユーザーエクスペリエンスにとって重要
    • パフォーマンスデータは、専用のAPI関数を介して照会できる
    • クライアント/サーバ間のタイムライン
      1. クライアントでポーズ推定
      2. サーバでレンダリング
      3. サーバからエンコードされた画像を送信
      4. クライアントでデコード、画像表示
    • フレーム統計クエリ
      • レイテンシなど、最後のフレームに関するいくつかの高レベルの情報を提供
      • videoFramesReceived、videoFrameReusedCount、および videoFramesDiscarded を使用して、ネットワークとサーバーのパフォーマンスを測定することができる
      • videoFramesReceived の値が低く、videoFrameReusedCount の値が高い場合は、ネットワークの混雑やサーバーのパフォーマンスの低さを示す
      • videoFramesDiscarded の値が高い場合も、ネットワークの混雑を示す
      • timeSinceLastPresent、videoFrameMinDelta、および videoFrameMaxDelta は、着信ビデオフレームとローカルプレゼントコールの分散を示す。分散が大きいということは、フレームレートが不安定であることを意味する
    • パフォーマンス評価クエリ
      • サーバーのCPUおよびGPUワークロードに関するより詳細な情報を提供
      • 値を評価するのに役立つように、各部分には、Great、Good、Mediocre、またはBadのような品質分類が付属している(絶対的なものではなく正常性の大まかな指標)
    • 統計デバッグ出力
      • フレーム統計とパフォーマンス評価クエリの両方をラップし、統計を集計値または事前に作成された文字列として返す便利な機能を提供

サンプル

  • PowerShellスクリプトの例
    • Azureリモートレンダリングは、次の2つのREST APIを提供
      • コンバート REST API
      • セッション REST API

コンセプト

  • リモートレンダリングセッション

    • Azure RemRemote Rendering ではセッションは重要な概念
    • セッションは、サーバーとの相互作用に関わるすべてのものを指す
      • 使用するマシンを予約(リース)する最初の要求から始まり、モデルのロードと操作のためのすべてのコマンドを続け、クラウドサーバー上のリースの解放で終わる
    • セッションに接続できるクライアントは1つだけ
  • エンティティ

    • エンティティは、空間内の移動オブジェクトを表し、リモートレンダリングされたコンテンツの基本的なビルディングブロック
    • エンティティは、サーバーがコンテンツをロードしたとき、またはユーザーがオブジェクトをシーンに追加したいときに作成される
  • コンポーネント

    • エンティティが位置や階層構造を表すのに対し、コンポーネントは動作を実装する責務がある
    • 最も頻繁に使用されるコンポーネントはメッシュコンポーネント
  • モデル

    • モデルには、ルートノードとしてエンティティが1つだけあり、その下に子エンティティの任意の階層がある
    • 変換プロセスでは、テクスチャ、マテリアル、メッシュなどのすべてのリソースが抽出され、最適化されたランタイムフォーマットに変換される
    • モデル変換は、メッシュを作成する唯一の方法。モデルをロードする以外に、実行時にメッシュを取得する方法はない
  • メッシュ

    • メッシュは不変の共有リソースであり、モデル変換によってのみ作成できる
    • メッシュには1つまたは複数のサブメッシュが含まれる
    • 3Dスペースにメッシュを配置するには、MeshComponentをEntityに追加する
  • テクスチャ

    • テクスチャは不変の共有リソース
    • テクスチャタイプ
      • 2Dテクスチャ:主にマテリアルで使用
      • キューブマップ:空に使用
    • サポートされているテクスチャフォーマット
  • マテリアル

    • マテリアルは、メッシュのレンダリング方法を定義する共有リソース
    • マテリアルはモデル変換時に自動的に作成され、実行時にアクセスできる
    • コードからカスタムマテリアルを作成し、既存のマテリアルを置き換えることもできる
    • マテリアルの種類
      • PBR マテリアル:できるだけ物理的に正確にレンダリングする必要があるサーフェスに使用される
      • Color マテリアル:追加の照明が必要ない場合に使用される
  • オブジェクトとリソースの寿命

    • Azure Remote Rendering はオブジェクトとリソースの2つのタイプを区別する
      • オブジェクト:ユーザーが独自の裁量で作成、変更、破棄できるものと見なされる
      • リソース:その寿命がリモートレンダリングホストによって完全に管理されるもの
    • すべてのオブジェクトとリソースの寿命は接続にバインドされている、切断時にはすべてが破棄される
    • 実際には、切断後の同じリソースのセッションへのロードは、通常、初回よりも高速(2回目はリソースのダウンロードが必要ないため)
  • オブジェクトの境界

    • オブジェクト境界は、エンティティとその子が占めるボリュームを表す
  • レンダリングモード

    • TileBasedComposition モードと DepthBasedComposition モードの2つの主要な操作モードがある
    • これらのモードは、サーバー上の複数の GPU にワークロードがどのように分散されるかを決定する
    • 最適なモードの選択はユースケースによる
  • グラフィックスバインディング

    • カスタムアプリケーションで Azure Remote Rendering を使用できるようにするには、アプリケーションのレンダリングパイプラインに統合する必要がある。この統合がグラフィックスバインディングの責任

ハウツーガイド

  • モデルを変換する

    • データを前処理して最適な形式にする必要がある
    • サポートされているソース形式
      • FBX (バージョン2011以降)
      • GLTF(バージョン2.x)
      • GLB (バージョン2.x)
  • 変換されたモデルに関する情報を取得する

    • 変換サービスの出力コンテナー内の arrAsset ファイルと同じ階層に JSON ファイルが生成され、モデルに関する情報にアクセス可能
  • Unityゲームオブジェクトとコンポーネントを操作する

    • モデルをロードすると、ロードしたモデルのルートオブジェクトへの参照を取得する
    • この参照は Unity のゲームオブジェクトではないが、拡張メソッド Entity.GetOrCreateGameObject() を使用して Unity のゲームオブジェクトにすることができる
    • Unity ゲームオブジェクトを作成すると、暗黙的に RemoteEntitySyncObject コンポーネントがゲームオブジェクトに追加される。このコンポーネントは、エンティティの transform をサーバーに同期するために使用される
    • RemoteEntitySyncObject を持つオブジェクトは、Unity エディタで「Show Children」ボタンを押すと、そのリモートの子をインスタンス化して表示することができる
    • ラッパーコンポーネント
      • リモートレンダリングエンティティにアタッチされたコンポーネントは、プロキシの MonoBehaviors を介して Unity に公開される。これらのプロキシは Unity でリモートコンポーネントを表現し、すべての変更をホストに転送する
    • リモートエンティティとUnityゲームオブジェクトのライフタイムは、RemoteEntitySyncObjectを介して結合されています。
  • Unityでホログラフィックリモート処理とリモートレンダリングを使用する

    • Holographic Remoting と Azure Remote Rendering は、1つのアプリケーション内で相互に排他的
  • クライアント側のパフォーマンストレースを作成する

    • Windows Performance Toolkitを通じてパフォーマンストレースを行う
    • ARRパフォーマンスの問題を特定するには、HoloLensで直接トレースを実行することがお勧め

リファレンス

リソース/ツール

  • ArrInspector検査ツール
    • ArrInspector は、実行中の Azure Remote Rendering セッションを検査するために使用されるWebベースのツール
    • デバッグの目的で使用する