Добавление удаленного взаимодействия с holographic (HoloLens (первый общий))Add Holographic Remoting (HoloLens (first gen))

Важно!

В этом документе описывается создание ведущего приложения для HoloLens 1.This document describes the creation of a host application for HoloLens 1. Ведущее приложение для HoloLens (1-го поколения) должно использовать пакет NuGet версии 1. x. x.Host application for HoloLens (1st gen) must use NuGet package version 1.x.x. Это подразумевает, что ведущие приложения, написанные для HoloLens 1, несовместимы с HoloLens 2 и наоборот.This implies that host applications written for HoloLens 1 are not compatible with HoloLens 2 and vice versa.

HoloLens 2HoloLens 2

Разработчики HoloLens, использующие holographic удаленное взаимодействие, должны обновить свои приложения, чтобы они были совместимы с HoloLens 2.HoloLens developers using Holographic Remoting will need to update their apps to make them compatible with HoloLens 2. Для этого требуется новая версия пакета NuGet удаленного взаимодействия Holographic.This requires a new version of the Holographic Remoting NuGet package. При подключении к удаленному проигрывателю holographic в HoloLens 2 используйте версию 2.0.0.0 или более позднюю из пакетов NuGet удаленного взаимодействия.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.

Примечание

Рекомендации, относящиеся к HoloLens 2, можно найти здесь.Guidance specific to HoloLens 2 can be found here.

Добавление удаленного взаимодействия holographic в приложение для настольных компьютеров или UWPAdd holographic remoting to your desktop or UWP app

На этой странице описывается добавление удаленного взаимодействия holographic в приложение для настольных компьютеров или приложений UWP.This page describes how to add Holographic Remoting to a desktop or UWP app.

Holographic удаленное взаимодействие позволяет приложению ориентироваться на HoloLens с holographic-содержимым, размещенным на настольном компьютере или на устройстве UWP, например на Xbox One.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. Кроме того, у вас есть доступ к дополнительным системным ресурсам, что позволяет интегрировать удаленные иммерсивное представления в имеющееся программное обеспечение для настольного ПК.You also have access to more system resources, making it possible to integrate remote immersive views into existing desktop PC software. Удаленное приложение узла удаленного взаимодействия получает поток входных данных от HoloLens, отображает содержимое в виртуальном иммерсивное представление и передает потоки содержимого обратно в 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. Подключение устанавливается с использованием стандартного Wi-Fi.The connection is made using standard Wi-Fi. Чтобы использовать удаленное взаимодействие, используйте пакет NuGet, чтобы добавить holographic удаленное взаимодействие в приложение для настольных систем или приложения UWP, а затем напишите код для обработки соединения и отображения иммерсивного представления.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. Вспомогательные библиотеки включены в пример кода, который упрощает задачу обработки подключения устройства.Helper libraries are included in the code sample that simplify the task of handling the device connection.

Типичное подключение удаленного взаимодействия будет иметь как минимум 50 мс задержки.A typical remoting connection will have as low as 50 ms of latency. Приложение проигрывателя может сообщать о задержке в режиме реального времени.The player app can report the latency in real time.

Примечание

Фрагменты кода в этой статье в настоящее время демонстрируют использование C++/CX вместо C + +17, совместимого с C++/WinRT, как используется в шаблоне C++ holographic.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. Понятия эквивалентны для проекта C++/WinRT, хотя код необходимо преобразовать.The concepts are equivalent for a C++/WinRT project, though you'll need to translate the code.

Получение пакетов NuGet для удаленного взаимодействияGet the remoting NuGet packages

Выполните следующие действия, чтобы получить пакет NuGet для удаленного взаимодействия holographic и добавить ссылку из проекта:Follow these steps to get the NuGet package for holographic remoting, and add a reference from your project:

  1. Перейдите к проекту в Visual Studio.Go to your project in Visual Studio.
  2. Щелкните правой кнопкой мыши узел проекта и выберите пункт Управление пакетами NuGet...Right-click on the project node and select Manage NuGet Packages...
  3. На появившейся панели селеккт Обзор и выполните поиск по фразе "удаленное взаимодействие" (holographic Remoting).In the panel that appears, selecct Browse and then search for "Holographic Remoting".
  4. Выберите Microsoft. Holographic. удаленное взаимодействие и селеккт Install.Select Microsoft.Holographic.Remoting and selecct Install.
  5. Если отображается диалоговое окно Предварительный просмотр , нажмите кнопку ОК.If the Preview dialog appears, select OK.
  6. Выберите я принимаю , когда откроется диалоговое окно Лицензионное соглашение.Select I Accept when the license agreement dialog appears.

Создание ХолографикстреамерхелперсCreate the HolographicStreamerHelpers

Сначала необходимо добавить экземпляр Холографикстреамерхелперс в класс, который будет обслуживать удаленное взаимодействие.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;

Кроме того, необходимо будет отслеживанию состояния соединения.You'll also need to track connection state. Если вы хотите подготовить к просмотру предварительную версию, необходимо иметь текстуру для копирования.If you want to render the preview, you need to have a texture to copy it to. Кроме того, необходимо выполнить несколько действий, например блокировку состояния подключения, способ хранения IP-адреса HoloLens и т. д.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;

Инициализация Холографикстреамерхелперс и подключение к HoloLensInitialize HolographicStreamerHelpers and connect to HoloLens

Чтобы подключиться к устройству HoloLens, создайте экземпляр Холографикстреамерхелперс и подключитесь к целевому IP-адресу.To connect to a HoloLens device, create an instance of HolographicStreamerHelpers and connect to the target IP address. Необходимо задать размер видеокадра в соответствии с шириной и высотой HoloLens, так как библиотека holographic Remoting предполагает, что декодеры и разрешения кодировщика полностью совпадают.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);
       }

Подключение устройства является асинхронным.The device connection is asynchronous. Приложение должно предоставить обработчики событий для событий подключения, отключения и отправки кадров.Your app needs to provide event handlers for connect, disconnect, and frame send events.

Событие onconnected может обновлять пользовательский интерфейс, начинать отрисовку и т. д.The OnConnected event can update the UI, start rendering, and so on. В нашем примере кода для настольной системы мы обновляем заголовок окна с сообщением "Connected" (подключено).In our desktop code sample, we update the window title with a "connected" message.

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

Событие OnDisconnection может поддерживать повторное подключение, обновления пользовательского интерфейса и т. д.The OnDisconnected event can handle reconnection, UI updates, and so on. В этом примере мы выполним повторное подключение при наличии временного сбоя.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.");
               }
           });

Когда компонент удаленного взаимодействия готов отправить кадр, приложение предоставляет возможность создать его копию в Сендфрамивент.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. Здесь мы копируем фрейм в цепочку буферов, чтобы мы могли отобразить ее в окне предварительного просмотра.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 содержимымRender holographic content

Для отображения содержимого с помощью удаленного взаимодействия вы настраиваете виртуальные IFrameworkView в приложении для настольных систем или приложения UWP и обрабатываюте holographic-пакеты с удаленного взаимодействия.To render content using remoting, you set up a virtual IFrameworkView within your desktop or UWP app and process holographic frames from remoting. Все API-интерфейсы Windows holographic по-разному используются в этом представлении, но настраиваются немного иначе.All of the Windows Holographic APIs are used the same way by this view, but it's set up slightly differently.

Вместо того, чтобы создавать их самостоятельно, компоненты holographic и речи берутся из класса Холографикремотингхелперс: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);

Вместо использования цикла обновления в методе Run вы предоставляете обновления тактов из главного цикла приложения UWP или рабочего стола.Instead of using an update loop in a Run method, you provide tick updates from the main loop of your desktop or UWP app. Это позволяет рабочему столу или приложению UWP оставаться в управлении обработкой сообщений.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.
   }

Метод Tick () в представлении приложения holographic завершает одну итерацию обновления, прорисовки, представления цикла.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);
           }
       }
   }

Цикл обновления, подготовки к просмотру и представления с помощью приложения holographic точно так же, как и при работе в HoloLens, за исключением того, что у вас есть доступ к гораздо большей части системных ресурсов на настольном компьютере.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. Вы можете визуализировать больше треугольников, увеличить число проходов рисования, сделать более физикой и использовать процессы x64 для загрузки содержимого, которое требует более 2 ГБ ОЗУ.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.

Отключение и завершение удаленного сеансаDisconnect and end the remote session

Для отключения, например, когда пользователь нажимает кнопку пользовательского интерфейса для отключения команды Disconnect () на Холографикстреамерхелперс, а затем освобождает объект.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;
       }
   }

Получение проигрывателя удаленного взаимодействияGet the remoting player

Проигрыватель удаленного взаимодействия Windows holographic предлагается в магазине приложений Windows в качестве конечной точки для подключения приложений узла удаленного взаимодействия.The Windows Holographic remoting player is offered in the Windows app store as an endpoint for remoting host apps to connect to. Чтобы получить проигрыватель удаленного взаимодействия Windows holographic, перейдите в магазин приложений Windows из HoloLens, найдите удаленное взаимодействие и скачайте приложение.To get the Windows Holographic remoting player, visit the Windows app store from your HoloLens, search for Remoting, and download the app. Проигрыватель удаленного взаимодействия включает функцию для отображения статистики на экране, которая может быть полезной при отладке приложений удаленного узла.The remoting player includes a feature to display statistics on-screen, which can be useful when debugging remoting host apps.

Заметки и ресурсыNotes and resources

В представлении с holographic приложений потребуется способ предоставить приложению Direct3D-устройство, которое должно использоваться для инициализации Holographic.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. Приложение должно использовать это устройство Direct3D для копирования и вывода кадра предварительного просмотра.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;
       }

Пример кода: Доступен полный пример кода с удаленным взаимодействием holographic , включающий представление приложения holographic, совместимое с удаленным взаимодействием и проектами удаленного взаимодействия для настольных приложений Win32, UWP DirectX и UWP с XAML.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.

Примечание к отладке: Библиотека holographic Remoting может создавать исключения с первого шанса.Debugging note: The Holographic Remoting library can throw first-chance exceptions. Эти исключения могут отображаться в сеансах отладки в зависимости от параметров исключений Visual Studio, которые активны в момент времени.These exceptions may be visible in debugging sessions, depending on the Visual Studio exception settings that are active at the time. Эти исключения захватываются внутри библиотеки holographic Remoting и могут быть пропущены.These exceptions are caught internally by the Holographic Remoting library and can be ignored.