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. De 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 Holographic Remoting NuGet-pakket 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.

Notitie

Richtlijnen die specifiek zijn voor HoloLens 2 vindt u hier.

Holografische externe communicatie toevoegen aan uw desktop- of UWP-app

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

Met holografische externe communicatie 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 externe insluitende weergaven 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 met behulp van 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, schrijft u vervolgens code om de verbinding af te handelen en een meeslepende weergave weer te geven. Helperbibliotheken zijn opgenomen in het codevoorbeeld waarmee de taak voor het afhandelen van de apparaatverbinding wordt vereenvoudigd.

Een typische externe verbinding heeft een lage latentie van wel 50 ms. De speler-app kan de latentie in realtime rapporteren.

Notitie

De codefragmenten in dit artikel demonstreren momenteel het gebruik van C++/CX in plaats van C++17-compatibele C++/WinRT zoals gebruikt in de C++-holografische projectsjabloon. De concepten zijn gelijkwaardig voor een C++/WinRT-project, maar u moet de code wel 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 wordt weergegeven 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 met de gebruiksrechtovereenkomst wordt weergegeven.

HolographicStreamerHelpers maken

Eerst moeten we een exemplaar van HolographicStreamerHelpers toevoegen aan de klasse die externe communicatie afhandelt.

#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 naar 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 holografische externe communicatiebibliotheek 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, verbinding verbreken en verzenden via frame.

De gebeurtenis OnConnected kan de gebruikersinterface bijwerken, de rendering starten, 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 is.

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 klaar 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 externe communicatie, stelt u een virtuele IFrameworkView in uw bureaublad- of UWP-app in en verwerkt u holografische frames van externe communicatie. Alle Windows Holographic API's worden op dezelfde manier gebruikt in deze weergave, maar deze is iets anders ingesteld.

In plaats van ze zelf te maken, zijn de holografische ruimte- en spraakonderdelen afkomstig uit de 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. Hierdoor kan uw bureaublad- of UWP-app de controle houden over de berichtverwerking.

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, draw, present-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 is precies hetzelfde als bij het uitvoeren op HoloLens, behalve dat u toegang hebt tot een veel grotere hoeveelheid 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.

Verbinding verbreken en de externe sessie beëindigen

Als u de verbinding wilt verbreken, bijvoorbeeld wanneer de gebruiker op een ui-knop klikt om de verbinding te verbreken, roept u Disconnect() aan op holographicStreamerHelpers en laat u het object 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 Externe Windows Holographic-speler wordt aangeboden in de Windows App Store als een eindpunt voor externe host-apps om verbinding mee te maken. Als u de Windows Holographic-speler voor externe communicatie wilt downloaden, gaat u naar de Windows App Store via uw HoloLens, zoekt u naar Externe toegang en downloadt u de app. De speler voor externe toegang bevat een functie om statistieken op het scherm weer te geven, wat handig kan zijn bij het opsporen van fouten in 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, dat een holografische toepassingsweergave bevat die compatibel is met externe en externe hostprojecten voor desktop Win32, UWP DirectX en UWP met XAML.

Opmerking over 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. Deze uitzonderingen worden intern opgevangen door de Holographic Remoting-bibliotheek en kunnen worden genegeerd.

Zie ook