Partager via


Ajouter la communication à distance holographique (HoloLens 1ère génération)

Si vous débutez avec la communication à distance holographique, vous voudrez peut-être lire notre vue d’ensemble.

Importante

Ce document décrit la création d’une application hôte pour HoloLens 1. L’application hôte pour HoloLens (1ère génération) doit utiliser le package NuGet version 1.x.x. Cela implique que les applications hôtes écrites pour HoloLens 1 ne sont pas compatibles avec HoloLens 2 et vice versa.

HoloLens 2

Les développeurs HoloLens qui utilisent la communication à distance holographique doivent mettre à jour leurs applications pour les rendre compatibles avec HoloLens 2. Il nécessite une nouvelle version du package NuGet Holographic Remoting. Veillez à utiliser la version 2.0.0.0 ou ultérieure du package NuGet Holographic Remoting lors de la connexion au lecteur de communication à distance Holographic sur HoloLens 2. Sinon, la connexion échoue.

Remarque

Des conseils spécifiques à HoloLens 2 sont disponibles ici.

Ajouter la communication à distance holographique à votre application de bureau ou UWP

Cette page explique comment ajouter la communication à distance holographique à une application de bureau ou UWP.

La communication à distance holographique permet à votre application de cibler un HoloLens avec du contenu holographique hébergé sur un PC de bureau ou sur un appareil UWP tel que Xbox One. Vous avez également accès à davantage de ressources système, ce qui permet d’intégrer des vues immersives à distance dans des logiciels pc de bureau existants. Une application hôte de communication à distance reçoit un flux de données d’entrée d’un HoloLens, affiche le contenu dans une vue immersive virtuelle et diffuse en continu des images de contenu vers HoloLens. La connexion est établie à l’aide du Wi-Fi standard. Pour utiliser la communication à distance, utilisez un package NuGet pour ajouter la communication à distance holographique à votre application de bureau ou UWP, puis écrivez du code pour gérer la connexion et afficher une vue immersive. Les bibliothèques d’assistance sont incluses dans l’exemple de code qui simplifient la gestion de la connexion de l’appareil.

Une connexion à distance classique a une latence inférieure à 50 ms. L’application lecteur peut signaler la latence en temps réel.

Remarque

Les extraits de code de cet article illustrent actuellement l’utilisation de C++/CX plutôt que C++/WinRT conforme À C++/WinRT, tel qu’utilisé dans le modèle de projet holographique C++. Les concepts sont équivalents pour un projet C++/WinRT, mais vous devez traduire le code.

Obtenir les packages NuGet de communication à distance

Suivez ces étapes pour obtenir le package NuGet pour la communication à distance holographique et ajouter une référence à partir de votre projet :

  1. Accédez à votre projet dans Visual Studio.
  2. Cliquez avec le bouton droit sur le nœud du projet, puis sélectionnez Gérer les packages NuGet...
  3. Dans le panneau qui s’affiche, sélectionnez Parcourir , puis recherchez « Communication à distance holographique ».
  4. Sélectionnez Microsoft.Holographic.Remoting , puis sélectionnez Installer.
  5. Si la boîte de dialogue Aperçu s’affiche, sélectionnez OK.
  6. Sélectionnez J’accepte lorsque la boîte de dialogue contrat de licence s’affiche.

Créer holographicStreamerHelpers

Tout d’abord, nous devons ajouter un instance de HolographicStreamerHelpers à la classe qui gère la communication à distance.

#include <HolographicStreamerHelpers.h>

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

Vous devez également suivre l’état de la connexion. Si vous souhaitez afficher l’aperçu, vous devez disposer d’une texture vers laquelle la copier. Vous avez également besoin de quelques éléments tels qu’un verrou d’état de connexion, un moyen de stocker l’adresse IP d’HoloLens, etc.

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;

Initialiser HolographicStreamerHelpers et se connecter à HoloLens

Pour vous connecter à un appareil HoloLens, créez un instance d’HolographicStreamerHelpers et connectez-vous à l’adresse IP cible. Vous devez définir la taille de l’image vidéo pour qu’elle corresponde à la largeur et à la hauteur de l’affichage HoloLens, car la bibliothèque Holographic Remoting s’attend à ce que les résolutions de l’encodeur et du décodeur correspondent exactement.

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

La connexion de l’appareil est asynchrone. Votre application doit fournir des gestionnaires d’événements pour les événements de connexion, de déconnexion et d’envoi de trame.

L’événement OnConnected peut mettre à jour l’interface utilisateur, démarrer le rendu, etc. Dans notre exemple de code de bureau, nous mettons à jour le titre de la fenêtre avec un message « connecté ».

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

L’événement OnDisconnected peut gérer la reconnexion, les mises à jour de l’interface utilisateur, etc. Dans cet exemple, nous nous reconnectons en cas de défaillance temporaire.

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

Lorsque le composant de communication à distance est prêt à envoyer un frame, votre application a la possibilité d’en effectuer une copie dans l’événement SendFrameEvent. Ici, nous copions le cadre dans une chaîne d’échange afin de pouvoir l’afficher dans une fenêtre d’aperçu.

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

Afficher du contenu holographique

Pour afficher du contenu à l’aide de la communication à distance, vous configurez un IFrameworkView virtuel dans votre application de bureau ou UWP et vous traitez les images holographiques à partir de la communication à distance. Toutes les API Windows Holographiques sont utilisées de la même façon par cette vue, mais elles sont configurées différemment.

Au lieu de les créer vous-même, l’espace holographique et les composants vocaux proviennent de votre classe HolographicRemotingHelpers :

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

Au lieu d’utiliser une boucle de mise à jour dans une méthode Run, vous fournissez des mises à jour de graduation à partir de la boucle principale de votre application de bureau ou UWP. Il permet à votre application de bureau ou UWP de garder le contrôle du traitement des messages.

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

       // display preview, etc.
   }

La méthode Tick() de l’affichage d’application holographique effectue une itération de la boucle de mise à jour, de dessin et de présentation.

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

La boucle de mise à jour, de rendu et de présentation de l’affichage de l’application holographique sont exactement les mêmes que lors de l’exécution sur HoloLens, sauf que vous avez accès à une plus grande quantité de ressources système sur votre PC de bureau. Vous pouvez afficher beaucoup plus de triangles, avoir plus de passes de dessin, faire plus de physique et utiliser des processus x64 pour charger du contenu qui nécessite plus de 2 Go de RAM.

Déconnecter et mettre fin à la session à distance

Pour vous déconnecter , par exemple, lorsque l’utilisateur clique sur un bouton d’interface utilisateur pour se déconnecter, appelez Disconnect() sur HolographicStreamerHelpers, puis relâchez l’objet.

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

Obtenir le lecteur de communication à distance

Le lecteur de communication à distance Windows Holographic est proposé dans l’App Store Windows en tant que point de terminaison pour les applications hôtes de communication à distance auxquelles se connecter. Pour obtenir le lecteur de communication à distance Holographique Windows, visitez l’App Store Windows à partir de votre HoloLens, recherchez Remoting et téléchargez l’application. Le lecteur de communication à distance inclut une fonctionnalité permettant d’afficher des statistiques à l’écran, ce qui peut être utile lors du débogage des applications hôtes de communication à distance.

Notes et ressources

La vue d’application holographique a besoin d’un moyen de fournir à votre application l’appareil Direct3D, qui doit être utilisé pour initialiser l’espace holographique. Votre application doit utiliser cet appareil Direct3D pour copier et afficher le cadre d’aperçu.

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

Exemple de code : Un exemple de code de communication à distance holographique complet est disponible. Il inclut une vue d’application holographique compatible avec les projets hôtes de communication à distance et de communication à distance pour le bureau Win32, UWP DirectX et UWP avec XAML.

Remarque sur le débogage : La bibliothèque Holographic Remoting peut lever des exceptions de première chance. Ces exceptions peuvent être visibles dans les sessions de débogage, en fonction des paramètres d’exception Visual Studio qui sont actifs à ce moment-là. La bibliothèque Holographic Remoting intercepte ces exceptions en interne et peut être ignorée.

Voir aussi