Delen via


Holoographic Remoting toevoegen (HoloLens 1e generatie)

Als u geen gebruik hebt van Holographic Remoting, kunt u ons overzicht lezen.

Belangrijk

In dit document wordt het maken van een hosttoepassing voor HoloLens 1 beschreven. Hosttoepassing voor HoloLens (1e generatie) moet NuGet-pakketversie 1.x.x gebruiken. Dit betekent dat hosttoepassingen die zijn geschreven voor HoloLens 1 niet compatibel zijn met HoloLens 2 en vice versa.

HoloLens 2

HoloLens-ontwikkelaars die Holographic Remoting gebruiken, moeten hun apps bijwerken om ze compatibel te maken met HoloLens 2. Hiervoor is een nieuwe versie van het NuGet-pakket Holographic Remoting vereist. Zorg ervoor dat u versie 2.0.0.0 of hoger van het Holographic Remoting NuGet-pakket gebruikt wanneer u verbinding maakt met de Holographic Remoting Player op HoloLens 2. Anders mislukt de verbinding.

Opmerking

Richtlijnen die specifiek zijn voor HoloLens 2 vindt u hier.

Holografische remoting toevoegen aan uw bureaublad- of UWP-app

Op deze pagina wordt beschreven hoe u Holographic Remoting toevoegt aan een desktop- of UWP-app.

Met holografische remoting kan uw app zich richten op een HoloLens met holografische inhoud die wordt gehost op een desktop-pc of op een UWP-apparaat zoals de Xbox One. U hebt ook toegang tot meer systeembronnen, waardoor het mogelijk is om insluitende weergaven op afstand te integreren in bestaande desktop-pc-software. Een externe host-app ontvangt een invoergegevensstroom van een HoloLens, geeft inhoud weer in een virtuele insluitende weergave en streamt inhoudsframes terug naar HoloLens. De verbinding wordt gemaakt via standaard Wi-Fi. Als u externe toegang wilt gebruiken, gebruikt u een NuGet-pakket om holografische externe communicatie toe te voegen aan uw bureaublad of UWP-app. Schrijf vervolgens code om de verbinding af te handelen en een meeslepende weergave weer te geven. Helperbibliotheken zijn opgenomen in het codevoorbeeld waarmee de taak van het afhandelen van de apparaatverbinding wordt vereenvoudigd.

Een typische externe verbinding heeft slechts 50 ms latentie. De speler-app kan de latentie in realtime rapporteren.

Opmerking

In de codefragmenten in dit artikel wordt momenteel het gebruik van C++/CX in plaats van C++17-compatibele C++/WinRT gedemonstreerde, zoals gebruikt in de holografische projectsjabloon C++ van C++. De concepten zijn gelijkwaardig voor een C++/WinRT-project, hoewel u de code moet vertalen.

De externe NuGet-pakketten ophalen

Volg deze stappen om het NuGet-pakket voor holografische externe communicatie op te halen en een verwijzing uit uw project toe te voegen:

  1. Ga naar uw project in Visual Studio.
  2. Klik met de rechtermuisknop op het projectknooppunt en selecteer NuGet-pakketten beheren...
  3. Selecteer bladeren in het deelvenster dat verschijnt en zoek vervolgens naar 'Holographic Remoting'.
  4. Selecteer Microsoft.Holographic.Remoting en selecteer Installeren.
  5. Als het dialoogvenster Voorbeeld wordt weergegeven, selecteert u OK.
  6. Selecteer Ik ga akkoord wanneer het dialoogvenster Licentieovereenkomst wordt weergegeven.

De HolographicStreamerHelpers maken

Eerst moeten we een exemplaar van HolographicStreamerHelpers toevoegen aan de klasse die externe toegang verwerkt.

#include <HolographicStreamerHelpers.h>

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

U moet ook de verbindingsstatus bijhouden. Als u het voorbeeld wilt weergeven, moet u een patroon hebben om het te kopiëren. U hebt ook een paar dingen nodig, zoals een verbindingsstatusvergrendeling, een manier om het IP-adres van HoloLens op te slaan, enzovoort.

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 initialiseren en verbinding maken met HoloLens

Als u verbinding wilt maken met een HoloLens-apparaat, maakt u een exemplaar van HolographicStreamerHelpers en maakt u verbinding met het doel-IP-adres. U moet de grootte van het videoframe zo instellen dat deze overeenkomt met de breedte en hoogte van het HoloLens-beeldscherm, omdat de holographic Remoting-bibliotheek verwacht dat de resolutie van de encoder en decoder exact overeenkomen.

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);
       }

De apparaatverbinding is asynchroon. Uw app moet gebeurtenis-handlers bieden voor het maken van verbinding, de verbinding verbreken en het frame verzenden van gebeurtenissen.

De gebeurtenis OnConnected kan de gebruikersinterface bijwerken, beginnen met renderen, enzovoort. In ons voorbeeld van de bureaubladcode werken we de titel van het venster bij met een 'verbonden' bericht.

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

De gebeurtenis OnDisconnected kan opnieuw verbinding maken, ui-updates, enzovoort verwerken. In dit voorbeeld maken we opnieuw verbinding als er een tijdelijke fout optreedt.

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.");
               }
           });

Wanneer het externe onderdeel gereed is om een frame te verzenden, krijgt uw app de mogelijkheid om er een kopie van te maken in het SendFrameEvent. Hier kopiëren we het frame naar een wisselketen, zodat we het in een voorbeeldvenster kunnen weergeven.

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));
               }
           });

Holografische inhoud weergeven

Als u inhoud wilt weergeven met behulp van externe toegang, stelt u een virtuele IFrameworkView in uw bureaublad- of UWP-app in en verwerkt u holografische frames tegen externe toegang. Alle Windows Holographic API's worden op dezelfde manier gebruikt door deze weergave, maar deze is anders ingesteld.

In plaats van ze zelf te maken, zijn de holografische ruimte- en spraakonderdelen afkomstig van uw Klasse HolographicRemotingHelpers:

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

In plaats van een updatelus in een Run-methode te gebruiken, geeft u vinkjesupdates op vanuit de hoofdlus van uw bureaublad- of UWP-app. Hiermee kan uw bureaublad- of UWP-app de controle houden over de verwerking van berichten.

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

       // display preview, etc.
   }

De methode Tick() van de holografische app-weergave voltooit één iteratie van de update, tekenen, huidige lus.

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);
           }
       }
   }

De holografische app-weergave-lus is precies hetzelfde als wanneer deze wordt uitgevoerd op HoloLens, behalve dat u toegang hebt tot een groter aantal systeembronnen op uw desktop-pc. U kunt veel meer driehoeken weergeven, meer tekenpassen hebben, meer natuurkunde uitvoeren en x64-processen gebruiken om inhoud te laden waarvoor meer dan 2 GB RAM is vereist.

De externe sessie verbreken en beëindigen

Als u de verbinding wilt verbreken, bijvoorbeeld wanneer de gebruiker op een knop van de gebruikersinterface klikt om de verbinding te verbreken, roept u Disconnect() aan op de HolographicStreamerHelpers en laat u het object vervolgens los.

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;
       }
   }

De externe speler ophalen

De Windows Holographic Remoting Player wordt aangeboden in de Windows App Store als eindpunt voor externe host-apps waarmee verbinding kan worden gemaakt. Als u de Windows Holographic Remoting-speler wilt downloaden, gaat u naar de Windows App Store vanuit uw HoloLens, zoekt u naar Externe toegang en downloadt u de app. De speler voor externe toegang bevat een functie om statistieken weer te geven op het scherm, wat handig kan zijn bij het opsporen van problemen met externe host-apps.

Notities en resources

De holografische app-weergave heeft een manier nodig om uw app te voorzien van het Direct3D-apparaat, dat moet worden gebruikt om de holografische ruimte te initialiseren. Uw app moet dit Direct3D-apparaat gebruiken om het voorbeeldframe te kopiëren en weer te geven.

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

Codevoorbeeld: Er is een volledig holographic remoting-codevoorbeeld beschikbaar. Het bevat een holografische toepassingsweergave die compatibel is met externe en externe hostprojecten voor desktop Win32, UWP DirectX en UWP met XAML.

Opmerking voor foutopsporing: De Holographic Remoting-bibliotheek kan uitzonderingen voor de eerste kans genereren. Deze uitzonderingen kunnen zichtbaar zijn in foutopsporingssessies, afhankelijk van de visual Studio-uitzonderingsinstellingen die op dat moment actief zijn. De Holographic Remoting-bibliotheek vangt deze uitzonderingen intern op en kan worden genegeerd.

Zie ook