Agregar comunicación remota holográfica (HoloLens 1.ª generación)

Si no está familiarizado con la comunicación remota holográfica, es posible que quiera leer nuestra introducción.

Importante

En este documento se describe la creación de una aplicación host para HoloLens 1. La aplicación host para HoloLens (1.ª generación) debe usar la versión 1.x.x del paquete NuGet. Esto implica que las aplicaciones host escritas para HoloLens 1 no son compatibles con HoloLens 2 y viceversa.

HoloLens 2

Los desarrolladores de HoloLens que usan la comunicación remota holográfica tendrán que actualizar sus aplicaciones para que sean compatibles con HoloLens 2. Esto requiere una nueva versión del paquete NuGet de comunicación remota holográfica. Asegúrese de usar la versión 2.0.0.0 o posterior del paquete NuGet de comunicación remota holográfica al conectarse al reproductor de comunicación remota holográfica en HoloLens 2. De lo contrario, se producirá un error en la conexión.

Nota

Puede encontrar instrucciones específicas de HoloLens 2 aquí.

Agregar comunicación remota holográfica a tu aplicación de escritorio o UWP

En esta página se describe cómo agregar la comunicación remota holográfica a una aplicación de escritorio o para UWP.

La comunicación remota holográfica permite a la aplicación tener como destino un Dispositivo HoloLens con contenido holográfico hospedado en un equipo de escritorio o en un dispositivo UWP, como Xbox One. También tienes acceso a más recursos del sistema, lo que permite integrar vistas envolventes remotas en el software de pc de escritorio existente. Una aplicación host de comunicación remota recibe un flujo de datos de entrada de HoloLens, representa el contenido en una vista envolvente virtual y transmite fotogramas de contenido a HoloLens. La conexión se realiza mediante wi-fi estándar. Para usar la comunicación remota, usa un paquete NuGet para agregar la comunicación remota holográfica a tu aplicación de escritorio o para UWP y, a continuación, escribe código para controlar la conexión y representar una vista envolvente. Las bibliotecas auxiliares se incluyen en el ejemplo de código que simplifican la tarea de controlar la conexión del dispositivo.

Una conexión remota típica tendrá tan solo 50 ms de latencia. La aplicación del reproductor puede notificar la latencia en tiempo real.

Nota

Los fragmentos de código de este artículo muestran actualmente el uso de C++/CX en lugar de C++17 compatible con C++/WinRT como se usa en la plantilla de proyecto holográfica de C++. Los conceptos son equivalentes para un proyecto de C++/WinRT, aunque deberá traducir el código.

Obtención de los paquetes NuGet de comunicación remota

Siga estos pasos para obtener el paquete NuGet para la comunicación remota holográfica y agregar una referencia desde el proyecto:

  1. Vaya al proyecto en Visual Studio.
  2. Haga clic con el botón derecho en el nodo del proyecto y seleccione Administrar paquetes NuGet...
  3. En el panel que aparece, seleccione Examinar y busque "Comunicación remota holográfica".
  4. Seleccione Microsoft.Holographic.Remoting y seleccione Instalar.
  5. Si aparece el cuadro de diálogo Vista previa , seleccione Aceptar.
  6. Seleccione Acepto cuando aparezca el cuadro de diálogo contrato de licencia.

Creación de HolographicStreamerHelpers

En primer lugar, es necesario agregar una instancia de HolographicStreamerHelpers a la clase que controlará la comunicación remota.

#include <HolographicStreamerHelpers.h>

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

También deberá realizar un seguimiento del estado de conexión. Si desea representar la vista previa, debe tener una textura para copiarla. También necesitas algunas cosas como un bloqueo de estado de conexión, alguna manera de almacenar la dirección IP de 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;

Inicializar HolographicStreamerHelpers y conectarse a HoloLens

Para conectarse a un dispositivo HoloLens, cree una instancia de HolographicStreamerHelpers y conéctese a la dirección IP de destino. Tendrás que establecer el tamaño del fotograma de vídeo para que coincida con el ancho y alto de la pantalla de HoloLens, ya que la biblioteca de comunicación remota holográfica espera que el codificador y las resoluciones del descodificador coincidan exactamente.

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 conexión del dispositivo es asincrónica. La aplicación debe proporcionar controladores de eventos para eventos de conexión, desconexión y envío de fotogramas.

El evento OnConnected puede actualizar la interfaz de usuario, iniciar la representación, etc. En nuestro ejemplo de código de escritorio, actualizamos el título de la ventana con un mensaje "conectado".

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

El evento OnDisconnected puede controlar la reconexión, las actualizaciones de la interfaz de usuario, etc. En este ejemplo, se vuelve a conectar si se produce un error transitorio.

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

Cuando el componente de comunicación remota está listo para enviar un marco, la aplicación le ofrece la oportunidad de hacer una copia en sendframeEvent. Aquí, copiamos el marco en una cadena de intercambio para que podamos mostrarlo en una ventana de vista previa.

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

Representación del contenido holográfico

Para representar contenido mediante comunicación remota, configuras un IFrameworkView virtual dentro de tu aplicación de escritorio o UWP y procesas fotogramas holográficos desde la comunicación remota. Todas las API de Windows Holographic se usan de la misma manera en esta vista, pero se configura de forma ligeramente diferente.

En lugar de crearlos usted mismo, el espacio holográfico y los componentes de voz proceden de la clase HolographicRemotingHelpers:

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

En lugar de usar un bucle de actualización en un método Run, proporcionas actualizaciones de tics desde el bucle principal de la aplicación para UWP o de escritorio. Esto permite que tu aplicación de escritorio o UWP permanezca en control del procesamiento de mensajes.

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

       // display preview, etc.
   }

El método Tick() de la vista de la aplicación holográfica completa una iteración de la actualización, dibujar y presentar bucle.

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

El bucle de actualización, representación y presentación de la vista de aplicaciones holográficas es exactamente el mismo que cuando se ejecuta en HoloLens, excepto que tiene acceso a una cantidad mucho mayor de recursos del sistema en el equipo de escritorio. Puede representar muchos más triángulos, tener más pases de dibujo, hacer más física y usar procesos x64 para cargar contenido que requiere más de 2 GB de RAM.

Desconectar y finalizar la sesión remota

Para desconectar ( por ejemplo, cuando el usuario hace clic en un botón de interfaz de usuario para desconectar), llame a Disconnect() en HolographicStreamerHelpers y, a continuación, suelte el objeto .

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

Obtener el reproductor de comunicación remota

El reproductor de comunicación remota de Windows Holographic se ofrece en la Tienda de aplicaciones de Windows como punto de conexión para que las aplicaciones host de comunicación remota se conecten. Para obtener el reproductor de comunicación remota de Windows Holographic, visite la Tienda de aplicaciones de Windows desde HoloLens, busque Comunicación remota y descargue la aplicación. El reproductor de comunicación remota incluye una característica para mostrar estadísticas en pantalla, lo que puede ser útil al depurar aplicaciones host de comunicación remota.

Notas y recursos

La vista de la aplicación holográfica necesitará una manera de proporcionar a la aplicación el dispositivo Direct3D, que se debe usar para inicializar el espacio holográfico. La aplicación debe usar este dispositivo Direct3D para copiar y mostrar el marco de vista previa.

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

Ejemplo de código: Hay disponible un ejemplo completo de código de comunicación remota holográfica , que incluye una vista de aplicación holográfica compatible con proyectos de host de comunicación remota y comunicación remota para Win32 de escritorio, DirectX para UWP y UWP con XAML.

Nota de depuración: La biblioteca de comunicación remota holográfica puede producir excepciones de primera oportunidad. Estas excepciones pueden ser visibles en las sesiones de depuración, en función de la configuración de excepciones de Visual Studio que estén activas en el momento. La biblioteca de comunicación remota holográfica detecta internamente estas excepciones y se puede omitir.

Consulte también