Ö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.
- Projeyi Visual Studio'da açın.
- Proje düğümüne sağ tıklayın ve NuGet Paketlerini Yönet... seçeneğini belirleyin.
- Görüntülenen panelde Gözat'ı seçin ve ardından "Holographic Remoting" araması yapın.
- 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.
- Önizleme iletişim kutusu görüntülenirse Tamam'ı seçin.
- 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:
- Çözüm Gezgini Package.appxmanifest dosyasına sağ tıklayın ve Birlikte Aç... seçeneğini belirleyin.
- XML (Metin) Düzenleyicisi'ni ve ardından Tamam'ı seçin
- 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:
- HoloLens 2 üzerinde çalışan oynatıcı uygulaması uzak uygulamaya bağlanır.
- 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()
}
Bağlantıyla ilgili olayları işleme
, PlayerContext
bağlantının durumunu izlemek için üç olayı kullanıma sunar
- OnConnected: Uzak uygulamaya bağlantı başarıyla kurulduğunda tetiklendi.
m_onConnectedEventToken = m_playerContext.OnConnected([]()
{
// Handle connection successfully established
});
- 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
.
- 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.
- Bir geri dönüş odak noktası belirtmek için, öncesinde
PlayerContext::BlitRemoteFrame
HolographicCameraRenderingParameters::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ş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
:
- Uzak uygulama HolographicCameraRenderingParameters.CommitDirect3D11DepthBuffer aracılığıyla bir derinlik arabelleği işledi.
- Özel oynatıcı uygulamasını çağırmadan önce
BlitRemoteFrame
geçerli bir derinlik arabelleğine bağlanmıştır.
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::ProjectionTransformConfig
denetleyebilirsiniz. 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::BlitRemoteFrameTimeout
2.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::ConfigureOverRendering
etkinleş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.
- Holografik Uzaktan İletişime Genel Bakış
- Windows Mixed Reality API'lerini kullanarak Holographic Remoting uzak uygulaması yazma
- OpenXR API'lerini kullanarak holografik uzaktan iletişim uzak uygulaması yazma
- Özel Holografik Uzaktan İletişim veri kanalları
- Holographic Remoting ile güvenli bir bağlantı kurma
- Holografik Uzaktan İletişim sorunlarını giderme ve sınırlamalar
- Holographic Remoting yazılım lisans koşulları
- Microsoft Gizlilik Bildirimi