Holographic のリモート処理を追加します。Add holographic remoting

HoloLens 2HoloLens 2

注意

HoloLens 2 に固有のガイダンスについて近日します。More guidance specific to HoloLens 2 coming soon.

Holographic のリモート処理を使用している HoloLens 開発者は、HoloLens 2 に対応できるようにするには、そのアプリを更新する必要があります。HoloLens developers using Holographic Remoting will need to update their apps to make them compatible with HoloLens 2. まだ公開されていないリモート処理の Holographic の NuGet パッケージの新しいバージョンが必要になります。This will require a new version of the Holographic Remoting NuGet package that is not publicly available yet. HoloLens の NuGet パッケージを使用して、アプリケーションでは、HoloLens 2 Holographic のリモート処理 Player に接続しようとして、接続は失敗します。If an application using the HoloLens NuGet package attempts to connect to the Holographic Remoting Player on HoloLens 2, the connection will fail. HoloLens 2 NuGet パッケージが使用可能な更新プログラムは、このページをご覧ください。Watch this page for updates once the HoloLens 2 NuGet package is available.

Holographic のリモート処理をデスクトップまたは UWP アプリに追加します。Add holographic remoting to your desktop or UWP app

このページには、デスクトップまたは UWP アプリに Holographic のリモート処理を追加する方法について説明します。This page describes how to add Holographic Remoting to a desktop or UWP app.

Holographic のリモート処理により、アプリ、デスクトップ PC または Xbox One、多くのシステム リソースへのアクセス許可とにできるように統合リモートなどの UWP デバイスでホスト holographic のコンテンツを含む、HoloLens をターゲットに没入型のビューに既存のデスクトップ PC のソフトウェア。Holographic remoting allows your app to target a HoloLens with holographic content hosted on a desktop PC or on a UWP device such as the Xbox One, allowing access to more system resources and making it possible to integrate remote immersive views into existing desktop PC software. リモート処理ホストのアプリ、HoloLens から、入力データ ストリームを受信するには、仮想の没入型ビューでコンテンツをレンダリングおよびコンテンツ フレームは、HoloLens をストリームします。A remoting host app receives an input data stream from a HoloLens, renders content in a virtual immersive view, and streams content frames back to HoloLens. 標準の Wi-fi を使用して接続が確立します。The connection is made using standard Wi-Fi. リモート処理を使用して、するには、NuGet パッケージを使用して、デスクトップまたは UWP アプリに holographic のリモート処理を追加し、接続を処理し、没入型のビューで表示するためにコードを記述します。To use remoting, you will use a NuGet package to add holographic remoting to your desktop or UWP app, and write code to handle the connection and to render in an immersive view. デバイスの接続を処理するタスクを簡略化するコード サンプルでは、ヘルパー ライブラリが含まれます。Helper libraries are included in the code sample that simplify the task of handling the device connection.

一般的なリモート処理接続が 50 ミリ秒の待機時間と低い必要があります。A typical remoting connection will have as low as 50 ms of latency. プレーヤー アプリは、リアルタイムでの待機時間を報告できます。The player app can report the latency in real-time.

注意

この記事のコード スニペットは現在の使用を示すC++/CX ではなく c++ 17 に準拠していませんC++/WinRT で使用するため、 C++ holographic プロジェクト テンプレートします。The code snippets in this article currently demonstrate use of C++/CX rather than C++17-compliant C++/WinRT as used in the C++ holographic project template. 概念は、同等のC++/WinRT のプロジェクトがコードに変換する必要があります。The concepts are equivalent for a C++/WinRT project, though you will need to translate the code.

NuGet パッケージのリモート処理の取得します。Get the remoting NuGet packages

Holographic のリモート処理用の NuGet パッケージを取得する次の手順に従ってし、プロジェクトからの参照を追加します。Follow these steps to get the NuGet package for holographic remoting, and add a reference from your project:

  1. Visual Studio でプロジェクトに移動します。Go to your project in Visual Studio.
  2. プロジェクト ノードを右クリックしてNuGet パッケージの管理.Right-click on the project node and select Manage NuGet Packages...
  3. 表示されるパネル で、参照し、「Holographic リモート処理」を検索します。In the panel that appears, click Browse and then search for "Holographic Remoting".
  4. 選択Microsoft.Holographic.Remotingクリックインストールします。Select Microsoft.Holographic.Remoting and click Install.
  5. 場合、プレビューダイアログが表示されたら、をクリックしてOKします。If the Preview dialog appears, click OK.
  6. 表示される次のダイアログ ボックスでは、使用許諾契約書です。The next dialog that appears is the license agreement. をクリックして同意ライセンス契約に同意します。Click on I Accept to accept the license agreement.

作成、HolographicStreamerHelpersCreate the HolographicStreamerHelpers

最初に、インスタンス HolographicStreamerHelpers の必要があります。First, we need an instance of HolographicStreamerHelpers. これは、リモート処理を処理するクラスを追加します。Add this to the class that will be handling remoting.

#include <HolographicStreamerHelpers.h>

   private:
       Microsoft::Holographic::HolographicStreamerHelpers^ m_streamerHelpers;

また、接続状態を追跡する必要があります。You'll also need to track connection state. プレビューを表示する場合にコピーするテクスチャをする必要があります。If you want to render the preview, you need to have a texture to copy it to. また、接続状態のロック、HoloLens の IP アドレスを格納する何らかの方法など、いくつかのものが必要し、など。You also need a few things like a connection state lock, some way of storing the IP address of HoloLens, and so on.

private:
       Microsoft::Holographic::HolographicStreamerHelpers^ m_streamerHelpers;

       Microsoft::WRL::Wrappers::SRWLock                   m_connectionStateLock;

       RemotingHostSample::AppView^                        m_appView;
       Platform::String^                                   m_ipAddress;
       Microsoft::Holographic::HolographicStreamerHelpers^ m_streamerHelpers;

       Microsoft::WRL::Wrappers::CriticalSection           m_deviceLock;
       Microsoft::WRL::ComPtr<IDXGISwapChain1>             m_swapChain;
       Microsoft::WRL::ComPtr<ID3D11Texture2D>             m_spTexture;

HolographicStreamerHelpers を初期化し、HoloLens への接続Initialize HolographicStreamerHelpers and connect to HoloLens

HoloLens デバイスに接続するには、HolographicStreamerHelpers のインスタンスを作成し、ターゲット IP アドレスに接続します。To connect to a HoloLens device, create an instance of HolographicStreamerHelpers and connect to the target IP address. Holographic のリモート処理ライブラリが正確に一致するようにエンコーダーとデコーダーの解決策が必要ですので、HoloLens の表示幅と高さに合わせてビデオ フレーム サイズを設定する必要があります。You will need to set the video frame size to match the HoloLens display width and height, because the Holographic Remoting library expects the encoder and decoder resolutions to match exactly.

m_streamerHelpers = ref new HolographicStreamerHelpers();
       m_streamerHelpers->CreateStreamer(m_d3dDevice);

       // We currently need to stream at 720p because that's the resolution of our remote display.
       // There is a check in the holographic streamer that makes sure the remote and local
       // resolutions match. The default streamer resolution is 1080p.
       m_streamerHelpers->SetVideoFrameSize(1280, 720);

       try
       {
           m_streamerHelpers->Connect(m_ipAddress->Data(), 8001);
       }
       catch (Platform::Exception^ ex)
       {
           DebugLog(L"Connect failed with hr = 0x%08X", ex->HResult);
       }

デバイスの接続は非同期です。The device connection is asynchronous. Connect で、イベント ハンドラーを提供するアプリのニーズが接続解除、およびイベントをフレームに送信します。Your app needs to provide event handlers for connect, disconnect, and frame send events.

OnConnected イベントは、UI を更新のレンダリングを開始および具合です。The OnConnected event can update the UI, start rendering, and so on. デスクトップのコード サンプルで、「接続済み」のメッセージ ウィンドウのタイトルを更新します。In our desktop code sample, we update the window title with a "connected" message.

m_streamerHelpers->OnConnected += ref new ConnectedEvent(
           [this]()
           {
               UpdateWindowTitle();
           });

OnDisconnected イベントには、再接続や UI の更新を処理できます。The OnDisconnected event can handle reconnection, UI updates, and so on. この例では、一時的な障害が発生した場合を再接続します。In this example, we reconnect if there is a transient failure.

Platform::WeakReference streamerHelpersWeakRef = Platform::WeakReference(m_streamerHelpers);
       m_streamerHelpers->OnDisconnected += ref new DisconnectedEvent(
           [this, streamerHelpersWeakRef](_In_ HolographicStreamerConnectionFailureReason failureReason)
           {
               DebugLog(L"Disconnected with reason %d", failureReason);
               UpdateWindowTitle();

               // Reconnect if this is a transient failure.
               if (failureReason == HolographicStreamerConnectionFailureReason::Unreachable ||
                   failureReason == HolographicStreamerConnectionFailureReason::ConnectionLost)
               {
                   DebugLog(L"Reconnecting...");

                   try
                   {
                       auto helpersResolved = streamerHelpersWeakRef.Resolve<HolographicStreamerHelpers>();
                       if (helpersResolved)
                       {
                           helpersResolved->Connect(m_ipAddress->Data(), 8001);
                       }
                       else
                       {
                           DebugLog(L"Failed to reconnect because a disconnect has already occurred.\n");
                       }
                   }
                   catch (Platform::Exception^ ex)
                   {
                       DebugLog(L"Connect failed with hr = 0x%08X", ex->HResult);
                   }
               }
               else
               {
                   DebugLog(L"Disconnected with unrecoverable error, not attempting to reconnect.");
               }
           });

リモート処理コンポーネントのフレームを送信する準備ができたら、アプリには、SendFrameEvent にそのコピーを作成する機会が提供されます。When the remoting component is ready to send a frame, your app is provided an opportunity to make a copy of it in the SendFrameEvent. ここでは、コピー、フレーム スワップ チェーンにプレビュー ウィンドウに表示されることができるようにします。Here, we copy the frame to a swap chain so that we can display it in a preview window.

m_streamerHelpers->OnSendFrame += ref new SendFrameEvent(
           [this](_In_ const ComPtr<ID3D11Texture2D>& spTexture, _In_ FrameMetadata metadata)
           {
               if (m_showPreview)
               {
                   ComPtr<ID3D11Device1> spDevice = m_appView->GetDeviceResources()->GetD3DDevice();
                   ComPtr<ID3D11DeviceContext> spContext = m_appView->GetDeviceResources()->GetD3DDeviceContext();

                   ComPtr<ID3D11Texture2D> spBackBuffer;
                   ThrowIfFailed(m_swapChain->GetBuffer(0, IID_PPV_ARGS(&spBackBuffer)));

                   spContext->CopySubresourceRegion(
                       spBackBuffer.Get(), // dest
                       0,                  // dest subresource
                       0, 0, 0,            // dest x, y, z
                       spTexture.Get(),    // source
                       0,                  // source subresource
                       nullptr);           // source box, null means the entire resource

                   DXGI_PRESENT_PARAMETERS parameters = { 0 };
                   ThrowIfFailed(m_swapChain->Present1(1, 0, &parameters));
               }
           });

Holographic のコンテンツをレンダリングします。Render holographic content

コンテンツを表示するためにリモート処理を使用して、デスクトップまたは UWP アプリ内で仮想 IFrameworkView を設定および処理するリモート処理から holographic フレーム。To render content using remoting, you set up a virtual IFrameworkView within your desktop or UWP app and process holographic frames from remoting. すべての Windows Holographic Api と同じ方法で、このビューがわずかに異なる設定を使用します。All of the Windows Holographic APIs are uses the same way by this view, but it is set up slightly differently.

を作成する代わりに自分では、holographic 領域と音声のコンポーネントは、HolographicRemotingHelpers クラスから取得されます。Instead of creating them yourself, the holographic space and speech components come from your HolographicRemotingHelpers class:

m_appView->Initialize(m_streamerHelpers->HolographicSpace, m_streamerHelpers->RemoteSpeech);

Run メソッドの内部で、更新プログラムのループを使用する代わりに、デスクトップまたは UWP アプリのメイン ループからのティックの更新プログラムを提供します。Instead of using an update loop inside of a Run method, you provide tick updates from the main loop of your desktop or UWP app. デスクトップやメッセージの処理のコントロール内に存続する UWP アプリで利用できます。This allows your desktop or UWP app to remain in control of message processing.

void DesktopWindow::Tick()
   {
       auto lock = m_deviceLock.Lock();
       m_appView->Tick();

       // display preview, etc.
   }

Holographic アプリ ビューの Tick() メソッドは、更新、描画、存在するループの 1 つのイテレーションを完了します。The holographic app view's Tick() method completes one iteration of the update, draw, present loop.

void AppView::Tick()
   {
       if (m_main)
       {
           // When running on Windows Holographic, we can use the holographic rendering system.
           HolographicFrame^ holographicFrame = m_main->Update();

           if (holographicFrame && m_main->Render(holographicFrame))
           {
               // The holographic frame has an API that presents the swap chain for each
               // holographic camera.
               m_deviceResources->Present(holographicFrame);
           }
       }
   }

Holographic アプリ ビューを更新して、レンダリング、および存在のループはまったく同じときも HoloLens - で実行されているが、デスクトップ PC で量より多くのシステム リソースへのアクセスがあります。The holographic app view update, render, and present loop is exactly the same as it is when running on HoloLens - except that you have access to a much greater amount of system resources on your desktop PC. 多くの複数の三角形を表示、複数の描画パスがある、詳細物理学と x64 を使用してプロセスを必要とするコンテンツの読み込みに複数の 2 GB の RAM を実行できます。You can render many more triangles, have more drawing passes, do more physics, and use x64 processes to load content that requires more than 2 GB of RAM.

切断して、リモート セッションを終了します。Disconnect and end the remote session

-切断するための UI ボタンをクリックするなど、切断するには、HolographicStreamerHelpers で Disconnect() を呼び出すし、オブジェクトを解放します。To disconnect - for example, when the user clicks a UI button to disconnect - call Disconnect() on the HolographicStreamerHelpers, and then release the object.

void DesktopWindow::DisconnectFromRemoteDevice()
   {
       // Disconnecting from the remote device can change the connection state.
       auto exclusiveLock = m_connectionStateLock.LockExclusive();

       if (m_streamerHelpers != nullptr)
       {
           m_streamerHelpers->Disconnect();

           // Reset state
           m_streamerHelpers = nullptr;
       }
   }

リモート処理のプレーヤーを取得します。Get the remoting player

Windows Holographic のリモート処理 player は、リモート処理ホストのアプリに接続するためのエンドポイントとして、Windows アプリ ストアで提供されます。The Windows Holographic remoting player is offered in the Windows app store as an endpoint for remoting host apps to connect to. Windows Holographic のリモート処理のプレーヤーを取得するには、HoloLens、リモート処理、検索から Windows アプリ ストアにアクセスし、アプリをダウンロードします。To get the Windows Holographic remoting player, visit the Windows app store from your HoloLens, search for Remoting, and download the app. リモート処理のプレーヤーには、リモート処理ホストのアプリをデバッグするときに役に立ちますが、画面上の統計情報を表示する機能が含まれています。The remoting player includes a feature to display statistics on-screen, which can be useful when debugging remoting host apps.

ノートとリソースNotes and resources

Holographic アプリ ビューからホログラフィック領域を初期化するために使用する必要があります、Direct3D デバイスを持つアプリを指定する方法の必要があります。The holographic app view will need a way to provide your app with the Direct3D device, which must be used to initialize the holographic space. アプリは、この Direct3D デバイスを使用して、コピーして、プレビュー フレームを表示する必要があります。Your app should use this Direct3D device to copy and display the preview frame.

internal:
       const std::shared_ptr<DX::DeviceResources>& GetDeviceResources()
       {
           return m_deviceResources;
       }

コード サンプル: Holographic のリモート処理の完全なコード サンプルは、リモート処理とリモート デスクトップの Win32、UWP の DirectX および XAML での UWP プロジェクトをホストと互換性がある holographic アプリケーション ビューが含まれています。Code sample: A complete Holographic Remoting code sample is available, which includes a holographic application view that is compatible with remoting and remoting host projects for desktop Win32, UWP DirectX, and UWP with XAML. 取得するには、ここで参照してください。To get it, go here:

デバッグに注意してください。 Holographic のリモート処理ライブラリでは、初回の例外をスローします。Debugging note: The Holographic Remoting library can throw first-chance exceptions. これらの例外は、デバッグ時にアクティブになっている Visual Studio 例外設定によって、セッションで表示される可能性があります。These exceptions may be visible in debugging sessions, depending on the Visual Studio exception settings that are active at the time. これらの例外は無視して Holographic のリモート処理ライブラリによって内部的にキャッチされます。These exceptions are caught internally by the Holographic Remoting library and can be ignored.