Aracılığıyla paylaş


Ö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 Holographic Remoting oynatıcı uygulaması oluşturarak HoloLens 2'nizdeki uzak bir makineden çevreleyici görünümleri görüntüleyebilen özel bir uygulama oluşturabilirsiniz. Bu sayfadaki tüm kodlar ve çalışma projeleri Holographic Remoting örnekleri github deposunda bulunabilir.

Holografik Uzaktan İletişim oynatı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ülemesine olanak tanır. 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ı, Windows Karma Gerçeklik API'sini zaten 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

Holographic Remoting kullanan tüm uygulamalar, çok iş parçacıklı bir daire kullanmak için yazılmalıdır. Tek iş parçacıklı bir dairenin kullanımı desteklenir, ancak en iyi 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 alma

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... öğ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 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ç... öğesini seçin.
  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>

Oynatıcı bağlamını oluşturma

İlk adım olarak uygulamanın bir oyuncu 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 gönderilen Windows Karma Gerçeklik ç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 Karma Gerçeklik 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 Karma Gerçeklik API'siyle 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

Oynatı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'de çalışan oynatıcı uygulaması uzak uygulamaya bağlanır.
  2. Uzak uygulama HoloLens 2'de ç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 oynatı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ı dinleme 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ıldıysa veya bağlantı kurulamadıysa tetiklendi.
m_onDisconnectedEventToken = m_playerContext.OnDisconnected([](ConnectionFailureReason failureReason)
{
    switch (failureReason)
    {
        // Handle connection failed or terminated.
        // See ConnectionFailureReason for possible reasons.
    }
}

Not

Olası ConnectionFailureReason değerler dosyada Microsoft.Holographic.AppRemoting.idl belgelenmiştir.

  1. OnListening: Gelen bağlantıları dinlerken başlatılır.
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ın.PlayerContext::BlitRemoteFrame

BlitRemoteFrame geçerli HolographicFrame için geri arabelleğinin işleme hedefi olarak bağlı olmasını gerektirir. Arka arabellek, 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ı belirttiyse 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.

  • Geri dönüş odak noktası belirtmek için, öncesinde PlayerContext::BlitRemoteFrameHolographicCameraRenderingParameters::SetFocusPoint'i çağırın.
  • Uzak odak noktasının üzerine yazmak için, sonrasında HolographicCameraRenderingParameters::SetFocusPoint'i PlayerContext::BlitRemoteFrameçağırın.

Başarılı olduğunda döndürür BlitRemoteFrame BlitResult::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şturmayı kullanmak özel bir oynatıcı ile mümkündür.

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

  • Uzak uygulama HolographicCameraRenderingParameters.CommitDirect3D11DepthBuffer aracılığıyla bir derinlik arabelleği işledi.
  • Özel oynatıcı uygulaması çağrısından BlitRemoteFrameönce geçerli bir derinlik arabelleğine bağlandı.

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şlenen içerikle derinlik kesişimi olacak ek yerel içeriği işleyebilirsiniz. Ayrıca, uzak ve yerel olarak işlenen içerik için derinlik yeniden oluşturma işlemine sahip olmak için özel oynatıcınızdaki 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ıldığında ortaya çıkan sorunlardan biri, 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şlenebilir olmasıdır. 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 mesafelerini mi 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 mesafelerini 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, yakın düzlem uzaklıklarının minimum ve uzak düzlem uzaklıklarının maksimumu alınarak yapılır. Uzak veya yerel tarafın ters çevrilmiş olması durumunda, uzak < yakın/uzak düzlem uzaklıkları çevrilir.

İsteğe bağlı: BlitRemoteFrameTimeout değerini ayarlayın

Ö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ıldığını belirtir.

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

Zaman aşımını etkinleştirmek için özellik değerini 100 ms'ye eşit veya daha uzun 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çeve hakkındaki 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 dosyadaki PlayerFrameStatisticsbelgelere Microsoft.Holographic.AppRemoting.idl bakın.

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

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

İsteğe bağlı: Fazla İşleme

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, siyah bölgeleri azaltmak ve görüntüleme frustumunun ötesinde yapay olarak görünüm penceresi artırarak görsel kaliteyi artırmak için Over-Rendering kullanabilirsiniz.

Aşırı İşleme aracılığıyla PlayerContext::ConfigureOverRenderingetkinleştirilebilir.

, OverRenderingConfig gerçek görünüm penceresine kesirli boyut artışı 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ı: Sistem Eşitlemesini Koordine Edin

Sürüm 2.7.0 koordinat sistemi eşitlemesi ile başlayarak uzamsal verileri oynatı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: