Özel holografik uzaktan iletişim oynatıcı uygulaması yazma

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

Önemli

Bu belgede, HoloLens 2 için özel bir oynatıcı uygulamasının oluşturulması açıklanmaktadır. HoloLens 2 için yazılmış özel oynatıcılar HoloLens 1 için yazılmış uzak uygulamalarla uyumlu değildir. Bu, her iki uygulamanın da NuGet paket sürümü 2.x.x kullanması gerektiği anlamına gelir.

Özel bir Holografik Uzaktan İletişim oynatıcı uygulaması oluşturarak, HoloLens 2 uzak bir makineden çevreleyici görünümleri görüntüleyebilen özel bir uygulama oluşturabilirsiniz. Bu sayfadaki tüm kodlar ve çalışan projeler Holographic Remoting örnekleri github deposunda bulunabilir.

Holografik Uzaktan İletişim yürütücü, uygulamanızın daha fazla sistem kaynağına erişimi olan xbox one gibi bir masaüstü bilgisayarda veya UWP cihazında işlenen holografik içeriği görüntülemesini sağlar. Holographic Remoting oynatıcı uygulaması giriş verilerini holografik uzaktan iletişim uzak uygulamasına akışla gönderir ve görüntü ve ses akışı olarak çevreleyici bir görünüm alır. Bağlantı, standart Wi-Fi kullanılarak yapılır. Oynatıcı uygulaması oluşturmak için NuGet paketini kullanarak UWP uygulamanıza Holographic Remoting ekleyin. Ardından bağlantıyı işlemek ve çevreleyici bir görünüm görüntülemek için kod yazın.

Önkoşullar

İyi bir başlangıç noktası, zaten Windows Mixed Reality API'sini hedefleyen çalışan bir DirectX tabanlı UWP uygulamasıdır. Ayrıntılar için bkz. DirectX geliştirmeye genel bakış. Mevcut bir uygulamanız yoksa ve sıfırdan başlamak istiyorsanız C++ holografik proje şablonu iyi bir başlangıç noktasıdır.

Önemli

Çok iş parçacıklı bir daire kullanmak için Holographic Remoting kullanan tüm uygulamalar yazılmalıdır. Tek iş parçacıklı bir dairenin kullanımı desteklenir, ancak en uygun performansın altında olmasına ve kayıttan yürütme sırasında takılmaya yol açar. C++/WinRT winrt::init_apartment kullanırken, çok iş parçacıklı bir daire varsayılandır.

Holographic Remoting NuGet paketini edinin

NuGet paketini Visual Studio'daki bir projeye eklemek için aşağıdaki adımlar gereklidir.

  1. Projeyi Visual Studio'da açın.
  2. Proje düğümüne sağ tıklayın ve NuGet Paketlerini Yönet... seçeneğini belirleyin.
  3. Görüntülenen panelde Gözat'ı seçin ve ardından "Holographic Remoting" araması yapın.
  4. Microsoft.Holographic.Remoting'i seçin, en son 2.x.x sürümünü seçtiğinizden emin olun ve 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.

Önemli

build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl NuGet paketinin içinde Holographic Remoting tarafından kullanıma sunulan API için ayrıntılı belgeler bulunur.

Uygulamanın Package.appxmanifest dosyasını değiştirme

Uygulamayı NuGet paketi tarafından eklenen Microsoft.Holographic.AppRemoting.dll haberdar etmek için projede aşağıdaki adımların izlenmesi gerekir:

  1. Çözüm Gezgini Package.appxmanifest dosyasına sağ tıklayın ve Birlikte Aç... seçeneğini belirleyin.
  2. XML (Metin) Düzenleyicisi'ni ve ardından Tamam'ı seçin
  3. Dosyaya aşağıdaki satırları ekleyin ve kaydedin
  </Capabilities>

  <!--Add lines below -->
  <Extensions>
    <Extension Category="windows.activatableClass.inProcessServer">
      <InProcessServer>
        <Path>Microsoft.Holographic.AppRemoting.dll</Path>
        <ActivatableClass ActivatableClassId="Microsoft.Holographic.AppRemoting.PlayerContext" ThreadingModel="both" />
      </InProcessServer>
    </Extension>
  </Extensions>
  <!--Add lines above -->

</Package>

Yürütücü bağlamı oluşturma

İlk adım olarak uygulamanın bir oynatıcı bağlamı oluşturması gerekir.

// class declaration:

#include <winrt/Microsoft.Holographic.AppRemoting.h>

...

private:
// PlayerContext used to connect with a Holographic Remoting remote app and display remotely rendered frames
winrt::Microsoft::Holographic::AppRemoting::PlayerContext m_playerContext = nullptr;
// class implementation:

// Create the player context
// IMPORTANT: This must be done before creating the HolographicSpace (or any other call to the Holographic API).
m_playerContext = winrt::Microsoft::Holographic::AppRemoting::PlayerContext::Create();

Uyarı

Özel oynatıcı, oynatıcı uygulamasıyla Windows ile birlikte gelen Windows Mixed Reality çalışma zamanı arasına bir ara katman ekler. Bu, oyuncu bağlamının oluşturulması sırasında yapılır. Bu nedenle, yürütücü bağlamını oluşturmadan önce herhangi bir Windows Mixed Reality API'sindeki herhangi bir çağrı beklenmeyen davranışa neden olabilir. Önerilen yaklaşım, herhangi bir Karma Gerçeklik API'siyle etkileşim kurmadan önce oynatıcı bağlamını mümkün olduğunca erken oluşturmaktır. Çağrısından PlayerContext::Create önce hiçbir Windows Mixed Reality API'sinde oluşturulan veya alınan nesneleri daha sonra oluşturulan veya alınan nesnelerle hiçbir zaman karıştırmayın.

Daha sonra HolographicSpace, HolographicSpace.CreateForCoreWindow çağrılarak oluşturulabilir.

m_holographicSpace = winrt::Windows::Graphics::Holographic::HolographicSpace::CreateForCoreWindow(window);

Uzak uygulamaya bağlanma

Yürütücü uygulaması içerik işlemeye hazır olduğunda, uzak uygulamaya bir bağlantı kurulabilir.

Bağlantı aşağıdaki yollardan biriyle kurulabilir:

  1. HoloLens 2 üzerinde çalışan oynatıcı uygulaması uzak uygulamaya bağlanır.
  2. Uzak uygulama, HoloLens 2 üzerinde çalışan oynatıcı uygulamasına bağlanır.

Yürütücü uygulamasından uzak uygulamaya bağlanmak için ana bilgisayar adını ve bağlantı noktasını belirten yürütücü bağlamında yöntemini çağırın Connect . Varsayılan bağlantı noktası 8265'tir.

try
{
    m_playerContext.Connect(m_hostname, m_port);
}
catch(winrt::hresult_error& e)
{
    // Failed to connect. Get an error details via e.code() and e.message()
}

Önemli

Herhangi bir C++/WinRT API'sinde Connect olduğu gibi işlenmesi gereken bir winrt::hresult_error oluşturabilirsiniz.

Oynatıcı uygulamasında gelen bağlantıları dinlemek, yöntemi çağrılarak Listen yapılabilir. Bu çağrı sırasında hem el sıkışma bağlantı noktası hem de aktarım bağlantı noktası belirtilebilir. El sıkışma bağlantı noktası ilk el sıkışma için kullanılır. Veriler daha sonra aktarım bağlantı noktası üzerinden gönderilir. Varsayılan olarak 8265 ve 8266 numaralı bağlantı noktası kullanılır.

try
{
    m_playerContext.Listen(L"0.0.0.0", m_port, m_port + 1);
}
catch(winrt::hresult_error& e)
{
    // Failed to listen. Get an error details via e.code() and e.message()
}

, PlayerContext bağlantının durumunu izlemek için üç olayı kullanıma sunar

  1. OnConnected: Uzak uygulamaya bağlantı başarıyla kurulduğunda tetiklendi.
m_onConnectedEventToken = m_playerContext.OnConnected([]() 
{
    // Handle connection successfully established
});
  1. OnDisconnected: Kurulan bir bağlantı sonlandırılırsa veya bağlantı kurulamazsa tetikler.
m_onDisconnectedEventToken = m_playerContext.OnDisconnected([](ConnectionFailureReason failureReason)
{
    switch (failureReason)
    {
        // Handle connection failed or terminated.
        // See ConnectionFailureReason for possible reasons.
    }
}

Not

Olası ConnectionFailureReason değerler dosyasında belgelenmiştirMicrosoft.Holographic.AppRemoting.idl.

  1. OnListening: Gelen bağlantıları dinlerken başlar.
m_onListeningEventToken = m_playerContext.OnListening([]()
{
    // Handle start listening for incoming connections
});

Ayrıca bağlantı durumu, oynatıcı bağlamındaki ConnectionState özelliği kullanılarak sorgulanabilir.

winrt::Microsoft::Holographic::AppRemoting::ConnectionState state = m_playerContext.ConnectionState();

Uzaktan işlenen çerçeveyi görüntüleme

Uzaktan işlenen içeriği görüntülemek için HolographicFrame işlenirken öğesini çağırınPlayerContext::BlitRemoteFrame.

BlitRemoteFrame geçerli HolographicFrame için arka arabelleğin işleme hedefi olarak bağlı olmasını gerektirir. Geri arabelleği Direct3D11BackBuffer özelliği aracılığıyla HolographicCameraRenderingParameters'dan alınabiliyor.

Çağrıldığında, BlitRemoteFrame uzak uygulamadan alınan en son kareyi HolographicFrame'in BackBuffer'sine kopyalar. Ayrıca, uzak uygulama uzak çerçevenin işlenmesi sırasında bir odak noktası belirtmişse odak noktası kümesi ayarlanır.

// Blit the remote frame into the backbuffer for the HolographicFrame.
winrt::Microsoft::Holographic::AppRemoting::BlitResult result = m_playerContext.BlitRemoteFrame();

Not

PlayerContext::BlitRemoteFrame geçerli çerçeve için odak noktasının üzerine yazma olasılığı vardır.

Başarılı olduğunda döndürür BlitRemoteFrameBlitResult::Success_Color. Aksi takdirde hatanın nedenini döndürür:

  • BlitResult::Failed_NoRemoteFrameAvailable: Kullanılabilir uzak çerçeve olmadığından başarısız oldu.
  • BlitResult::Failed_NoCamera: Kamera olmadığından başarısız oldu.
  • BlitResult::Failed_RemoteFrameTooOld: Uzak çerçeve çok eski olduğundan başarısız oldu (bkz. PlayerContext::BlitRemoteFrameTimeout özelliği).

Önemli

Sürüm 2.1.0'dan başlayarak holografik uzaktan iletişim aracılığıyla derinlik yeniden oluşturma özelliğini kullanmak özel bir oyuncuyla mümkündür.

BlitResult aşağıdaki koşullar altında da döndürülebilir BlitResult::Success_Color_Depth :

Bu koşullar karşılanırsa, BlitRemoteFrame uzak derinliği o anda bağlı olan yerel derinlik arabelleğine böler. Daha sonra, uzak işlenmiş içerikle derinlik kesişimine sahip olacak ek yerel içeriği işleyebilirsiniz. Ayrıca, uzak ve yerel işlenmiş içerik için derinlik yeniden oluşturma işlemine sahip olmak için özel oynatıcınızda HolographicCameraRenderingParameters.CommitDirect3D11DepthBuffer aracılığıyla yerel derinlik arabelleği işleyebilirsiniz.

Projeksiyon Dönüştürme Modu

Holographic Remoting aracılığıyla derinlik yeniden oluşturma kullanılırken ortaya çıkan bir sorun, uzak içeriğin doğrudan özel oynatıcı uygulamanız tarafından işlenen yerel içerikten farklı bir projeksiyon dönüşümüyle işlenebileceğidir. Yaygın bir kullanım örneği, oyuncu tarafında ve uzak tarafta ( HolographicCamera::SetNearPlaneDistance ve HolographicCamera::SetFarPlaneDistance aracılığıyla) yakın ve uzak düzlem için farklı değerler belirtmektir. Bu durumda, oyuncu tarafındaki projeksiyon dönüşümlerinin uzak yakın/uzak düzlem uzaklıklarını mı yoksa yerel olanları mı yansıtması gerektiği net değildir.

Sürüm 2.1.0'dan başlayarak projeksiyon dönüştürme modunu aracılığıyla PlayerContext::ProjectionTransformConfigdenetleyebilirsiniz. Desteklenen değerler şunlardır:

  • Local - HolographicCameraPose::P rojectionTransform , HolographicCamera'da özel oynatıcı uygulamanız tarafından ayarlanan yakın/uzak düzlem mesafelerini yansıtan bir projeksiyon dönüşümü döndürür.
  • Remote - Projeksiyon dönüşümü, uzak uygulama tarafından belirtilen yakın/uzak düzlem uzaklıklarını yansıtır.
  • Merged - Uzak uygulamanızla özel oynatıcı uygulamanız arasında yakın/Uzak düzlem uzaklıkları birleştirilir. Varsayılan olarak bu, en az yakın uçak uzaklıkları ve uzak uçak uzaklıklarının maksimumları alınarak yapılır. Uzak veya yerel tarafın ters çevrilmiş olması durumunda uzak < yakın/uzak düzlem uzak mesafeleri çevrilir.

İsteğe bağlı: BlitRemoteFrameTimeout ayarlama

Önemli

PlayerContext::BlitRemoteFrameTimeout2.0.9 sürümünden itibaren desteklenir.

özelliği, PlayerContext::BlitRemoteFrameTimeout yeni uzak çerçeve alınmazsa uzak çerçevenin ne kadar süreyle yeniden kullanılıp yeniden kullanılamadığını belirtir.

Yaygın bir kullanım örneği, BlitRemoteFrame zaman aşımının belirli bir süre için yeni çerçeve alınmaması durumunda boş bir ekran görüntülemesini sağlamaktır. Etkinleştirildiğinde, yerel olarak işlenmiş bir geri dönüş içeriğine geçmek için yönteminin dönüş türü BlitRemoteFrame de kullanılabilir.

Zaman aşımını etkinleştirmek için özellik değerini 100 ms'ye eşit veya daha büyük bir süreye ayarlayın. Zaman aşımını devre dışı bırakmak için özelliğini sıfır süre olarak ayarlayın. Zaman aşımı etkinleştirilirse ve ayarlanan süre boyunca uzak çerçeve alınmazsa, BlitRemoteFrame başarısız olur ve yeni bir uzak çerçeve alınana kadar geri döner Failed_RemoteFrameTooOld .

using namespace std::chrono_literals;

// Set the BlitRemoteFrame timeout to 0.5s
m_playerContext.BlitRemoteFrameTimeout(500ms);

İsteğe bağlı: Son uzak çerçeveyle ilgili istatistikleri alma

Performans veya ağ sorunlarını tanılamak için, son uzak çerçeveyle ilgili istatistikler özelliği aracılığıyla PlayerContext::LastFrameStatistics alınabilir. İstatistikler HolographicFrame::P resentUsingCurrentPrediction çağrısı sırasında güncelleştirilir.

// Get statistics for the last presented frame.
winrt::Microsoft::Holographic::AppRemoting::PlayerFrameStatistics statistics = m_playerContext.LastFrameStatistics();

Daha fazla bilgi için dosyadakiPlayerFrameStatistics belgelere Microsoft.Holographic.AppRemoting.idl bakın.

İsteğe bağlı: Özel veri kanalları

Özel veri kanalları, kullanıcı verilerini önceden oluşturulmuş uzaktan iletişim bağlantısı üzerinden göndermek için kullanılabilir. Daha fazla bilgi için bkz. özel veri kanalları.

İsteğe bağlı: Over-Rendering

Holografik Uzaktan İletişim, işlenen görüntülerin ekranlarda göründüğü sırada kullanıcının kafasının nerede olacağını tahmin eder. Ancak bu tahmin yaklaşık bir tahmindir. Bu nedenle, uzak uygulamadaki tahmin edilen görünüm penceresi ve oynatıcı uygulamasındaki daha sonraki gerçek görünüm penceresi farklılık gösterebilir. Daha güçlü sapmalar (örneğin, öngörülemeyen hareket nedeniyle), görüntüleme frustumunun kenarlıklarında siyah bölgelere neden olabilir. Sürüm 2.6.0'dan başlayarak Over-Rendering kullanarak siyah bölgeleri azaltabilir ve görüntüleme frustumunun ötesindeki görünüm penceresi yapay olarak artırılarak görsel kaliteyi artırabilirsiniz.

Over-Rendering aracılığıyla PlayerContext::ConfigureOverRenderingetkinleştirilebilir.

, OverRenderingConfig gerçek görünüm penceresine kesirli boyut artışını belirtir, böylece tahmin edilen görünüm penceresi daha büyük hale gelir ve daha az kesme gerçekleşir. Artan görünüm penceresi boyutuyla piksel yoğunluğu azalır, bu nedenle OverRenderingConfig çözünürlüğü de artırmanıza olanak tanır. Görünüm penceresi artışı çözünürlük artışına eşitse piksel yoğunluğu aynı kalır. OverRenderingConfig şu şekilde tanımlanır:

struct OverRenderingConfig
{
    float HorizontalViewportIncrease; // The fractional horizontal viewport increase. (e.g. 10% -> 0.1).
    float VerticalViewportIncrease; // The fractional vertical viewport increase. (e.g. 10% -> 0.1).
                
    float HorizontalResolutionIncrease; // The fractional horizontal resolution increase. (e.g. 10% -> 0.1).
    float VerticalResolutionIncrease; // The fractional vertical resolution increase. (e.g. 10% -> 0.1).
};

İsteğe bağlı: Koordinat Sistemi Eşitleme

Sürüm 2.7.0 koordinat sistemi eşitlemesiyle başlayarak uzamsal verileri yürütücü ve uzak uygulama arasında hizalamak için kullanılabilir. Daha fazla bilgi için bkz. Holografik Uzaktan İletişime Genel Bakış ile Sistem Eşitlemesini Koordine Etme.

Ayrıca Bkz.