Přidání holografické vzdálené komunikace (HoloLens 1. generace)
Pokud s Holographic Remotingem začínáte, možná si budete chtít přečíst náš přehled.
Důležité
Tento dokument popisuje vytvoření hostitelské aplikace pro HoloLens 1. Hostitelská aplikace pro HoloLens (1. generace) musí používat balíček NuGet verze 1.x.x. To znamená, že hostitelské aplikace napsané pro HoloLens 1 nejsou kompatibilní s HoloLens 2 a naopak.
HoloLens 2
Vývojáři v HoloLensu, kteří používají Holographic Remoting, budou muset aktualizovat své aplikace, aby byly kompatibilní s HoloLens 2. To vyžaduje novou verzi balíčku NuGet Holographic Remoting. Při připojování k holografickému vzdálenému přehrávači na HoloLens 2 nezapomeňte použít verzi 2.0.0.0 nebo vyšší balíčku NuGet Holographic Remoting. V opačném případě připojení selže.
Poznámka
Pokyny specifické pro HoloLens 2 najdete tady.
Přidání holografické vzdálené komunikace do desktopové aplikace nebo aplikace pro UPW
Tato stránka popisuje, jak přidat holografickou vzdálenou komunikace do desktopové aplikace nebo aplikace pro UPW.
Holografická vzdálená komunikace umožňuje vaší aplikaci cílit na HoloLens s holografickým obsahem hostovaným na stolním počítači nebo na zařízení pro UPW, jako je Xbox One. Máte také přístup k více systémovým prostředkům, což umožňuje integraci vzdálených imerzivních zobrazení do stávajícího softwaru stolního počítače. Hostitelská aplikace vzdálené komunikace přijímá vstupní datový proud z HoloLensu, vykresluje obsah ve virtuálním imerzivním zobrazení a streamuje rámce obsahu zpět do HoloLensu. Připojení se provádí pomocí standardní Wi-Fi. Pokud chcete použít vzdálenou komunikace, použijte balíček NuGet k přidání holografické vzdálené komunikace do desktopové aplikace nebo aplikace pro UPW a pak napište kód pro zpracování připojení a vykreslení imerzivního zobrazení. Pomocné knihovny jsou součástí ukázky kódu, které zjednodušují zpracování připojení zařízení.
Typické vzdálené připojení bude mít latenci až 50 ms. Aplikace přehrávače může hlásit latenci v reálném čase.
Poznámka
Fragmenty kódu v tomto článku v současné době ukazují použití C++/CX místo C++17 kompatibilních C++/WinRT, jak se používá v šabloně holografického projektu C++. Koncepty jsou ekvivalentem pro projekt C++/WinRT, i když budete muset kód přeložit.
Získání balíčků NuGet pro vzdálené komunikace
Pomocí těchto kroků získejte balíček NuGet pro holografickou vzdálené komunikace a přidejte odkaz z projektu:
- Přejděte na svůj projekt v sadě Visual Studio.
- Klikněte pravým tlačítkem na uzel projektu a vyberte Spravovat balíčky NuGet...
- Na zobrazeném panelu vyberte Procházet a pak vyhledejte Holographic Remoting(Holographic Remoting).
- Vyberte Microsoft.Holographic.Remoting a vyberte Nainstalovat.
- Pokud se zobrazí dialogové okno Náhled , vyberte OK.
- Když se zobrazí dialogové okno licenční smlouvy, vyberte Souhlasím .
Vytvoření HolographicStreamerHelpers
Nejprve musíme přidat instanci HolographicStreamerHelpers do třídy, která bude zpracovávat vzdálené komunikace.
#include <HolographicStreamerHelpers.h>
private:
Microsoft::Holographic::HolographicStreamerHelpers^ m_streamerHelpers;
Budete také muset sledovat stav připojení. Pokud chcete zobrazit náhled, musíte mít texturu, do které ho chcete zkopírovat. Potřebujete také několik věcí, jako je zámek stavu připojení, nějaký způsob uložení IP adresy HoloLensu a tak dále.
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;
Inicializace HolographicStreamerHelpers a připojení k HoloLens
Pokud se chcete připojit k zařízení HoloLens, vytvořte instanci HolographicStreamerHelpers a připojte se k cílové IP adrese. Budete muset nastavit velikost rámečku videa tak, aby odpovídala šířce a výšce zobrazení HoloLens, protože knihovna Holographic Remoting očekává, že rozlišení kodéru a dekodéru budou přesně odpovídat.
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);
}
Připojení zařízení je asynchronní. Vaše aplikace musí poskytovat obslužné rutiny událostí pro události připojení, odpojení a odesílání rámců.
Událost OnConnected může aktualizovat uživatelské rozhraní, spustit vykreslování atd. V ukázce kódu na ploše aktualizujeme název okna zprávou "připojeno".
m_streamerHelpers->OnConnected += ref new ConnectedEvent(
[this]()
{
UpdateWindowTitle();
});
Událost OnDisconnected může zpracovávat opětovné připojení, aktualizace uživatelského rozhraní atd. V tomto příkladu se znovu připojíme, pokud dojde k přechodnému selhání.
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.");
}
});
Když je komponenta vzdálené komunikace připravená k odeslání rámce, je vaší aplikaci k dispozici možnost vytvořit jeho kopii v SendFrameEvent. Tady zkopírujeme rámeček do řetězu prohození, abychom ho mohli zobrazit v okně náhledu.
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, ¶meters));
}
});
Vykreslení holografického obsahu
Pokud chcete vykreslit obsah pomocí vzdálené komunikace, nastavíte virtuální objekt IFrameworkView v desktopové aplikaci nebo aplikaci pro UPW a zpracujete holografické rámce ze vzdálené komunikace. Všechna rozhraní API Windows Holographic se v tomto zobrazení používají stejným způsobem, ale jsou nastavená trochu jinak.
Místo toho, abyste je vytvářeli sami, holografický prostor a komponenty řeči pocházejí z vaší třídy HolographicRemotingHelpers:
m_appView->Initialize(m_streamerHelpers->HolographicSpace, m_streamerHelpers->RemoteSpeech);
Místo použití aktualizační smyčky v metodě Run poskytujete aktualizace zaškrtnutí z hlavní smyčky desktopové aplikace nebo aplikace pro UPW. To umožňuje, aby vaše desktopová aplikace nebo aplikace pro UPW zůstala pod kontrolou zpracování zpráv.
void DesktopWindow::Tick()
{
auto lock = m_deviceLock.Lock();
m_appView->Tick();
// display preview, etc.
}
Metoda Tick() holografického zobrazení aplikace dokončí jednu iteraci smyčky aktualizace, kreslení a prezentace.
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);
}
}
}
Smyčka aktualizace, vykreslování a prezentace holografické aplikace je úplně stejná jako při spuštění na HoloLensu – s tím rozdílem, že na stolním počítači máte přístup k mnohem většímu množství systémových prostředků. Můžete vykreslit mnohem více trojúhelníků, mít více průchodů výkresu, provádět více fyziky a používat procesy x64 k načtení obsahu, který vyžaduje více než 2 GB paměti RAM.
Odpojení a ukončení vzdálené relace
Pokud chcete odpojit – například když uživatel klikne na tlačítko uživatelského rozhraní pro odpojení – zavolejte Disconnect() na HolographicStreamerHelpers a pak objekt uvolněte.
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;
}
}
Získání hráče vzdálené komunikace
Přehrávač vzdálené komunikace Windows Holographic se nabízí ve Windows App Storu jako koncový bod pro vzdálené hostitelské aplikace, ke které se mají připojit. Pokud chcete získat přehrávač vzdálené komunikace Windows Holographic, navštivte z HoloLensu Windows App Store, vyhledejte vzdálené komunikace a stáhněte si aplikaci. Přehrávač vzdálené komunikace obsahuje funkci pro zobrazení statistik na obrazovce, která může být užitečná při ladění hostitelských aplikací vzdálené komunikace.
Poznámky a zdroje informací
Zobrazení holografické aplikace bude potřebovat způsob, jak aplikaci poskytnout zařízení Direct3D, které se musí použít k inicializaci holografického prostoru. Vaše aplikace by měla toto zařízení Direct3D používat ke kopírování a zobrazení náhledu rámečku.
internal:
const std::shared_ptr<DX::DeviceResources>& GetDeviceResources()
{
return m_deviceResources;
}
Ukázka kódu: K dispozici je kompletní ukázka kódu holografické vzdálené komunikace , která obsahuje zobrazení holografické aplikace, které je kompatibilní s projekty vzdálené komunikace a vzdálené komunikace pro desktopové Win32, UWP DirectX a UPW s XAML.
Poznámka k ladění: Knihovna Holographic Remoting může vyvolat první výjimky. Tyto výjimky se můžou zobrazit v relacích ladění v závislosti na nastavení výjimek sady Visual Studio, která jsou v daném okamžiku aktivní. Tyto výjimky jsou interně zachyceny knihovnou Holographic Remoting a je možné je ignorovat.
Viz také
- Holografická komunikace – přehled
- Psaní vlastní aplikace Holographic Remoting Player
- Navázání zabezpečeného připojení pomocí holografické vzdálené komunikace
- Řešení potíží a omezení holografické vzdálené komunikace
- Licenční podmínky pro software Holographic Remoting
- Prohlášení společnosti Microsoft o zásadách ochrany osobních údajů