Holographic-Remoting hinzufügen (hololens (erste Generation))Add Holographic Remoting (HoloLens (first gen))

Wichtig

In diesem Dokument wird die Erstellung einer Host Anwendung für hololens 1 beschrieben.This document describes the creation of a host application for HoloLens 1. Die Host Anwendung für hololens (1st Gen) muss das nuget-Paketversion 1. x. x verwenden.Host application for HoloLens (1st gen) must use NuGet package version 1.x.x. Dies bedeutet, dass für hololens 1 geschriebene Host Anwendungen nicht mit hololens 2 und umgekehrt kompatibel sind.This implies that host applications written for HoloLens 1 are not compatible with HoloLens 2 and vice versa.

HoloLens 2HoloLens 2

Hololens-Entwickler, die Holographic Remoting verwenden, müssen Ihre apps aktualisieren, damit Sie mit hololens 2 kompatibel sind.HoloLens developers using Holographic Remoting will need to update their apps to make them compatible with HoloLens 2. Hierfür ist eine neue Version des nuget-Pakets "Holographic Remoting" erforderlich.This requires a new version of the Holographic Remoting NuGet package. Stellen Sie sicher, dass Sie die Version 2.0.0.0 oder höher des Holographic Remoting-nuget-Pakets verwenden, wenn Sie eine Verbindung mit dem Holographic Remoting Player auf hololens 2 herstellen, da andernfalls die Verbindung fehlschlägt.Be sure to use version 2.0.0.0 or above of the Holographic Remoting NuGet package when connecting to the Holographic Remoting Player on HoloLens 2 or the connection will fail.

Hinweis

Anleitungen für hololens 2 finden Sie hier.Guidance specific to HoloLens 2 can be found here.

Hinzufügen von Holographic Remoting zu Ihrer Desktop-oder UWP-AppAdd holographic remoting to your desktop or UWP app

Auf dieser Seite wird beschrieben, wie Sie Holographic Remoting zu einer Desktop-oder UWP-app hinzufügen.This page describes how to add Holographic Remoting to a desktop or UWP app.

Holographic Remoting ermöglicht Ihrer APP das Ziel eines hololens mit Holographic-Inhalten, die auf einem Desktop-PC oder einem UWP-Gerät wie der Xbox One gehostet werden.Holographic remoting lets your app target a HoloLens with holographic content hosted on a desktop PC or on a UWP device such as the Xbox One. Sie haben auch Zugriff auf weitere Systemressourcen, sodass Sie die Möglichkeit haben, in vorhandene Desktop-PC-Software zu integrieren.You also have access to more system resources, making it possible to integrate remote immersive views into existing desktop PC software. Eine Remoting-Host-App empfängt einen Eingabedaten Strom von einem hololens, rendert Inhalte in einer virtuellen immersiven Ansicht und streamt Inhalts Frames zurück an 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. Die Verbindung wird mithilfe von Standard-Wi-Fi hergestellt.The connection is made using standard Wi-Fi. Um Remoting zu verwenden, verwenden Sie ein nuget-Paket, um der Desktop-oder UWP-App Holographic Remoting hinzuzufügen, und schreiben Sie dann Code, um die Verbindung zu verarbeiten und eine immersive Ansicht zu erzeugen.To use remoting, use a NuGet package to add holographic remoting to your desktop or UWP app, then write code to handle the connection and render an immersive view. Hilfsbibliotheken sind im Codebeispiel enthalten, das die Aufgabe der Verarbeitung der Geräte Verbindung vereinfacht.Helper libraries are included in the code sample that simplify the task of handling the device connection.

Eine typische remotingverbindung verfügt über bis zu 50 ms Latenzzeit.A typical remoting connection will have as low as 50 ms of latency. Die Player-App kann die Latenzzeit in Echtzeit melden.The player app can report the latency in real time.

Hinweis

Die Code Ausschnitte in diesem Artikel veranschaulichen derzeit die Verwendung von C++/CX anstelle von C + +17-kompatiblen C++/WinRT, wie Sie in der C++ Holographic-Projektvorlageverwendet werden.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. Die Konzepte sind äquivalent zu einem C++/WinRT-Projekt, obwohl Sie den Code übersetzen müssen.The concepts are equivalent for a C++/WinRT project, though you'll need to translate the code.

Remoting-nuget-PaketeGet the remoting NuGet packages

Führen Sie die folgenden Schritte aus, um das nuget-Paket für Holographic Remoting zu erhalten und einen Verweis aus dem Projekt hinzuzufügen:Follow these steps to get the NuGet package for holographic remoting, and add a reference from your project:

  1. Wechseln Sie zu Ihrem Projekt in Visual Studio.Go to your project in Visual Studio.
  2. Klicken Sie mit der rechten Maustaste auf den Projekt Knoten, und wählen Sie nuget-Pakete verwalten aus.Right-click on the project node and select Manage NuGet Packages...
  3. Wählen Sie im angezeigten Panel die Option Durchsuchen aus, und suchen Sie dann nach "Holographic Remoting".In the panel that appears, selecct Browse and then search for "Holographic Remoting".
  4. Wählen Sie " Microsoft. Holographic. Remoting " und "selecct install" aus.Select Microsoft.Holographic.Remoting and selecct Install.
  5. Wenn das Dialogfeld Vorschau angezeigt wird, klicken Sie auf OK.If the Preview dialog appears, select OK.
  6. Wählen Sie Ich akzeptiere aus, wenn das Dialogfeld Lizenzvertrag angezeigt wird.Select I Accept when the license agreement dialog appears.

Erstellen der holographicstreamerhilfsprogrammeCreate the HolographicStreamerHelpers

Zunächst müssen Sie der Klasse, die Remoting verarbeiten soll, eine Instanz von holographicstreamerhilfsprogramme hinzufügen.First, we need to add an instance of HolographicStreamerHelpers to the class that will handle remoting.

#include <HolographicStreamerHelpers.h>

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

Außerdem müssen Sie den Verbindungsstatus nachverfolgen.You'll also need to track connection state. Wenn Sie die Vorschau darstellen möchten, benötigen Sie eine Textur, in die Sie kopiert werden können.If you want to render the preview, you need to have a texture to copy it to. Außerdem benötigen Sie einige Dinge, wie z. b. eine Verbindungs Zustands Sperre, eine Möglichkeit, die IP-Adresse von hololens zu speichern, usw.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;

Initialisieren von holographicstreamerhilfsprogramme und verbinden mit hololensInitialize HolographicStreamerHelpers and connect to HoloLens

Zum Herstellen einer Verbindung mit einem hololens-Gerät erstellen Sie eine Instanz von holographicstreamerhilfsprogramme, und stellen Sie eine Verbindung mit der Ziel-IP-Adresse herTo connect to a HoloLens device, create an instance of HolographicStreamerHelpers and connect to the target IP address. Sie müssen die Video Frame Größe so festlegen, dass Sie mit der hololens-Anzeigebreite und-Höhe übereinstimmt, da die Holographic Remoting-Bibliothek erwartet, dass die Encoder-und decoderauflösungen genau übereinstimmen.You'll 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);
       }

Die Geräte Verbindung ist asynchron.The device connection is asynchronous. Ihre APP muss Ereignishandler für Connect-, Disconnect-und Frame Send-Ereignisse bereitstellen.Your app needs to provide event handlers for connect, disconnect, and frame send events.

Das onconnected-Ereignis kann die Benutzeroberfläche aktualisieren, das Rendering starten usw.The OnConnected event can update the UI, start rendering, and so on. In unserem Desktop Codebeispiel aktualisieren wir den Fenstertitel mit der Meldung "Connected" (verbunden).In our desktop code sample, we update the window title with a "connected" message.

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

Das ongetrennte-Ereignis kann die erneute Verbindung, Aktualisierungen der Benutzeroberfläche usw. verarbeiten.The OnDisconnected event can handle reconnection, UI updates, and so on. In diesem Beispiel wird die Verbindung wieder hergestellt, wenn ein vorübergehender Fehler auftritt.In this example, we reconnect if there's 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.");
               }
           });

Wenn die Remoting-Komponente bereit ist, einen Frame zu senden, bietet Ihre APP die Möglichkeit, eine Kopie davon im sendframeevent zu erstellen.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. Hier kopieren wir den Frame in eine Austausch Kette, damit wir ihn in einem Vorschaufenster anzeigen können.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-Inhalt WiedergabeRender holographic content

Zum Rendering von Inhalten mithilfe von Remoting richten Sie eine virtuelle iframeworkview innerhalb Ihrer Desktop-oder UWP-App ein und verarbeiten holografische Frames aus Remoting.To render content using remoting, you set up a virtual IFrameworkView within your desktop or UWP app and process holographic frames from remoting. Alle Windows Holographic-APIs werden in dieser Ansicht auf die gleiche Weise verwendet, Sie werden aber etwas anders eingerichtet.All of the Windows Holographic APIs are used the same way by this view, but it's set up slightly differently.

Anstatt Sie selbst zu erstellen, stammen die Holographic Space-und Speech-Komponenten von ihrer holographikremumughelpers-Klasse: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);

Anstatt eine Update Schleife in einer Run-Methode zu verwenden, stellen Sie Tick-Updates aus der Hauptschleife ihrer Desktop-oder UWP-App bereit.Instead of using an update loop in a Run method, you provide tick updates from the main loop of your desktop or UWP app. Dies ermöglicht es Ihrer Desktop-oder UWP-APP, die Kontrolle über die Nachrichtenverarbeitung zu behalten.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.
   }

Die Tick ()-Methode der Holographic-App-Ansicht schließt eine Iterationen der Update-, Draw-, Present-Schleife ab.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);
           }
       }
   }

Die Holographic App View Update-, Rendering-und Present-Schleife sind identisch mit der Ausführung auf hololens, mit der Ausnahme, dass Sie Zugriff auf eine viel größere Menge an Systemressourcen auf Ihrem Desktop-PC haben.The holographic app view update, render, and present loop are 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. Sie können viele weitere Dreiecke darstellen, mehr Zeichnungs Pässe haben, mehr Physik durchführen und x64-Prozesse zum Laden von Inhalten verwenden, die mehr als 2 GB RAM erfordern.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.

Trennen und Beenden der Remote SitzungDisconnect and end the remote session

So trennen Sie die Verbindung, z. b. wenn der Benutzer auf eine UI-Schaltfläche klickt, um die Verbindung zu trennen (), für die holographicstreamerhilfsprogramme.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;
       }
   }

Remoting PlayerGet the remoting player

Der Windows Holographic Remoting Player wird im Windows App Store als Endpunkt für Remoting-Host-apps angeboten, mit denen eine Verbindung hergestellt werden kann.The Windows Holographic remoting player is offered in the Windows app store as an endpoint for remoting host apps to connect to. Um den Windows Holographic Remoting Player zu erhalten, besuchen Sie den Windows App Store aus ihren hololens, suchen Sie nach Remoting, und laden Sie die APP herunter.To get the Windows Holographic remoting player, visit the Windows app store from your HoloLens, search for Remoting, and download the app. Der Remoting Player enthält ein Feature zum Anzeigen von Statistiken auf dem Bildschirm, was beim Debuggen von Remoting-Host-apps hilfreich sein kann.The remoting player includes a feature to display statistics on-screen, which can be useful when debugging remoting host apps.

Hinweise und RessourcenNotes and resources

In der Ansicht der Holographic-app muss die APP über das Direct3D-Gerät bereitgestellt werden, das zum Initialisieren des Holographic-Raums verwendet werden muss.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. Ihre APP sollte dieses Direct3D-Gerät verwenden, um den Vorschau Rahmen zu kopieren und anzuzeigen.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;
       }

Code Beispiel: Ein vollständiges Holographic Remoting-Codebeispiel ist verfügbar, das eine Holographic-Anwendungs Ansicht enthält, die mit Remoting-und Remoting-Host Projekten für Desktop Win32, UWP DirectX und UWP mit XAML kompatibel ist.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.

Debughinweis: Die Holographic Remoting-Bibliothek kann Ausnahmen der ersten Chance auslösen.Debugging note: The Holographic Remoting library can throw first-chance exceptions. Diese Ausnahmen sind möglicherweise in Debugsitzungen sichtbar, abhängig von den Visual Studio-Ausnahme Einstellungen, die zu diesem Zeitpunkt aktiv sind.These exceptions may be visible in debugging sessions, depending on the Visual Studio exception settings that are active at the time. Diese Ausnahmen werden intern von der Holographic Remoting-Bibliothek abgefangen und können ignoriert werden.These exceptions are caught internally by the Holographic Remoting library and can be ignored.