Holografik uzaktan iletişim ekleme (HoloLens 1. nesil)

Holographic Remoting'i yeni kullanıyorsanız genel bakış bilgilerimizi okumak isteyebilirsiniz.

Önemli

Bu belgede HoloLens 1 için bir konak uygulaması oluşturma işlemi açıklanmaktadır. HoloLens (1. nesil) için ana bilgisayar uygulaması NuGet paket sürümü 1.x.x kullanmalıdır. Bu, HoloLens 1 için yazılmış konak uygulamalarının HoloLens 2 ile uyumlu olmadığı anlamına gelir ve tam tersi de geçerlidir.

HoloLens 2

Holographic Remoting kullanan HoloLens geliştiricilerinin uygulamalarını HoloLens 2 uyumlu hale getirmek için güncelleştirmeleri gerekir. Bu, Holographic Remoting NuGet paketinin yeni bir sürümünü gerektirir. HoloLens 2 üzerinde Holographic Remoting Player'a bağlanırken Holographic Remoting NuGet paketinin 2.0.0.0 veya üzeri bir sürümünü kullandığınızdan emin olun. Aksi takdirde bağlantı başarısız olur.

Not

HoloLens 2 özgü yönergeler burada bulunabilir.

Masaüstünüze veya UWP uygulamanıza holografik uzaktan iletişim ekleme

Bu sayfada bir masaüstü veya UWP uygulamasına Holographic Remoting'in nasıl ekleneceği açıklanır.

Holografik uzaktan iletişim, uygulamanızın masaüstü bilgisayarda veya Xbox One gibi bir UWP cihazında barındırılan holografik içeriğe sahip bir HoloLens'i hedeflemesini sağlar. Ayrıca daha fazla sistem kaynağına erişiminiz olduğundan, uzak çevreleyici görünümleri mevcut masaüstü bilgisayar yazılımıyla tümleştirebilirsiniz. Uzaktan iletişim konağı uygulaması HoloLens'ten bir giriş veri akışı alır, içeriği sanal çevreleyici bir görünümde işler ve içerik çerçevelerini HoloLens'e geri akışla gönderir. Bağlantı, standart Wi-Fi kullanılarak yapılır. Uzaktan iletişim kullanmak için, masaüstü veya UWP uygulamanıza holografik uzaktan iletişim eklemek için bir NuGet paketi kullanın, ardından bağlantıyı işlemek ve çevreleyici bir görünüm oluşturmak için kod yazın. Yardımcı kitaplıklar, cihaz bağlantısını işleme görevini basitleştiren kod örneğine dahil edilir.

Tipik bir uzaktan iletişim bağlantısının gecikme süresi 50 ms'ye kadar düşer. Oynatıcı uygulaması gecikme süresini gerçek zamanlı olarak bildirebilir.

Not

Bu makaledeki kod parçacıkları şu anda C++ holografik proje şablonunda kullanılan C++17 uyumlu C++/WinRT yerine C++/CX kullanımını göstermektedir. Kavramlar bir C++/WinRT projesi için eşdeğerdir, ancak kodu çevirmeniz gerekir.

Uzaktan iletişim NuGet paketlerini alma

Holografik uzaktan iletişim için NuGet paketini almak ve projenizden bir başvuru eklemek için şu adımları izleyin:

  1. Visual Studio'da projenize gidin.
  2. Proje düğümüne sağ tıklayın ve NuGet Paketlerini Yönet... öğesini seçin.
  3. Görüntülenen panelde Gözat'ı seçin ve ardından "Holographic Remoting" araması yapın.
  4. Microsoft.Holographic.Remoting'i ve ardından Yükle'yi seçin.
  5. Önizleme iletişim kutusu görüntülenirse Tamam'ı seçin.
  6. Lisans sözleşmesi iletişim kutusu görüntülendiğinde Kabul Ediyorum'a tıklayın.

HolographicStreamerHelpers oluşturma

İlk olarak, uzaktan iletişimi işleyecek sınıfa bir HolographicStreamerHelpers örneği eklemeliyiz.

#include <HolographicStreamerHelpers.h>

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

Bağlantı durumunu da izlemeniz gerekir. Önizlemeyi işlemek istiyorsanız, kopyalanacak bir dokuya sahip olmanız gerekir. Ayrıca bağlantı durumu kilidi, HoloLens'in IP adresini depolamanın bir yolu gibi birkaç şeye de ihtiyacınız vardır.

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'ı başlatma ve HoloLens'e bağlanma

HoloLens cihazına bağlanmak için HolographicStreamerHelpers örneğini oluşturun ve hedef IP adresine bağlanın. Holographic Remoting kitaplığı kodlayıcı ve kod çözücü çözünürlüklerinin tam olarak eşleşmesini beklediğinden video çerçevesi boyutunu HoloLens ekran genişliği ve yüksekliğiyle eşleşecek şekilde ayarlamanız gerekir.

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

Cihaz bağlantısı zaman uyumsuz. Uygulamanızın bağlanma, bağlantıyı kesme ve çerçeve gönderme olayları için olay işleyicileri sağlaması gerekir.

OnConnected olayı kullanıcı arabirimini güncelleştirebilir, işlemeye başlayabilir vb. Masaüstü kod örneğimizde pencere başlığını "bağlı" iletisiyle güncelleştiriyoruz.

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

OnDisconnected olayı yeniden bağlanmayı, kullanıcı arabirimi güncelleştirmelerini vb. işleyebilir. Bu örnekte, geçici bir hata olduğunda yeniden bağlanacağız.

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

uzaktan iletişim bileşeni çerçeve göndermeye hazır olduğunda, uygulamanıza SendFrameEvent'te bir kopyasını oluşturma fırsatı sağlanır. Burada çerçeveyi bir değiştirme zincirine kopyalayarak önizleme penceresinde görüntüleyebiliriz.

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

Holografik içerik oluşturma

uzaktan iletişim kullanarak içerik işlemek için masaüstü veya UWP uygulamanızda sanal bir IFrameworkView ayarlar ve uzaktan iletişimden holografik çerçeveleri işlersiniz. Tüm Windows Holographic API'leri bu görünümde aynı şekilde kullanılır, ancak biraz farklı ayarlanır.

Bunları kendiniz oluşturmak yerine holografik alan ve konuşma bileşenleri HolographicRemotingHelpers sınıfınızdan gelir:

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

Run yönteminde bir güncelleştirme döngüsü kullanmak yerine masaüstünüzün veya UWP uygulamanızın ana döngüsünden onay işareti güncelleştirmeleri sağlarsınız. Bu, masaüstü veya UWP uygulamanızın ileti işleme denetiminde kalmasını sağlar.

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

       // display preview, etc.
   }

Holografik uygulama görünümünün Tick() yöntemi güncelleştirme, çizim ve sunum döngüsünün bir yinelemesini tamamlar.

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

Holografik uygulama görünümü güncelleştirmesi, işlemesi ve mevcut döngüsü HoloLens'te çalışırken olduğu gibi aynıdır; masaüstü bilgisayarınızda çok daha fazla miktarda sistem kaynağına erişiminiz olması dışında. 2 GB'tan fazla RAM gerektiren içeriği yüklemek için çok daha fazla üçgen işleyebilir, daha fazla çizim geçişi yapabilir, daha fazla fizik işlemi yapabilir ve x64 işlemlerini kullanabilirsiniz.

Uzak oturumun bağlantısını kesme ve sonlandırma

Bağlantıyı kesmek için - örneğin, kullanıcı bağlantısını kesmek için bir kullanıcı arabirimi düğmesine tıkladığında - HolographicStreamerHelpers üzerinde Disconnect() öğesini çağırın ve nesneyi serbest bırakın.

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

Uzaktan iletişim oynatıcıyı edinin

Windows Holographic uzaktan iletişim oynatıcısı, Windows uygulama mağazasında konak uygulamalarının bağlanacağı uzaktan iletişim için bir uç nokta olarak sunulur. Windows Holographic uzaktan iletişim oynatıcısını edinmek için HoloLens'inizden Windows uygulama mağazasını ziyaret edin, Uzaktan İletişim'i arayın ve uygulamayı indirin. uzaktan iletişim oynatıcısı, istatistiği ekranda görüntülemeye yönelik bir özellik içerir. Bu özellik, uzaktan iletişim konak uygulamalarında hata ayıklama sırasında yararlı olabilir.

Notlar ve kaynaklar

Holografik uygulama görünümü, uygulamanıza holografik alanı başlatmak için kullanılması gereken Direct3D cihazını sağlamanın bir yoluna ihtiyaç duyar. Uygulamanız, önizleme çerçevesini kopyalamak ve görüntülemek için bu Direct3D cihazını kullanmalıdır.

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

Kod örneği: Masaüstü Win32, UWP DirectX ve XAML ile UWP için uzaktan iletişim ve uzaktan iletişim konak projeleri ile uyumlu holografik bir uygulama görünümü içeren eksiksiz bir Holografik Uzaktan İletişim kod örneği mevcuttur.

Hata ayıklama notu: Holografik Uzaktan İletişim kitaplığı ilk şans özel durumları oluşturabilir. Bu özel durumlar, o sırada etkin olan Visual Studio özel durum ayarlarına bağlı olarak hata ayıklama oturumlarında görülebilir. Bu özel durumlar Holographic Uzaktan İletişim kitaplığı tarafından dahili olarak yakalanabilir ve yoksayılabilir.

Ayrıca Bkz.