Holographic Remoting Remote alkalmazás írása az OpenXR API használatával
Ha még nem ismerkedik a Holographic Remoting használatával, érdemes elolvasnia az áttekintést.
Fontos
Ez a dokumentum egy távoli alkalmazás létrehozását ismerteti HoloLens 2 és Windows Mixed Reality headsetekhez az OpenXR API használatával. A HoloLens távoli alkalmazásainak (1. generációs)NuGet-csomag 1.x.x-es verzióját kell használniuk. Ez azt jelenti, hogy a HoloLens 2 írt távoli alkalmazások nem kompatibilisek a HoloLens 1-zel, és fordítva. A HoloLens 1 dokumentációja itt található.
A Holographic Remoting-alkalmazások távolról renderelt tartalmakat streamelhetnek HoloLens 2 és Windows Mixed Reality magával ragadó fejhallgatókba. Emellett több rendszererőforrást is elérhet, és távoli , modern nézeteket integrálhat a meglévő asztali pc-szoftverekbe. A távoli alkalmazások bemeneti adatstreamet kapnak HoloLens 2, virtuális, modern nézetben renderelik a tartalmat, és a tartalomkereteket visszaküldik HoloLens 2. A kapcsolat standard Wi-Fi-vel jön létre. A holografikus remoting nuGet-csomagon keresztül kerül egy asztali vagy UWP-alkalmazásba. További kódra van szükség, amely kezeli a kapcsolatot, és magával ragadó nézetben jelenik meg. Egy tipikus újraegyenlítési kapcsolat 50 ms késéssel fog rendelkezni. A lejátszóalkalmazás valós időben jelentheti a késést.
Ezen a lapon és a munkaprojektekben található összes kód megtalálható a Holographic Remoting samples github-adattárban.
Előfeltételek
Jó kiindulópont egy működő OpenXR-alapú asztali vagy UWP-alkalmazás. További információ: Az OpenXR használatának első lépései.
Fontos
A Holographic Remotingot használó alkalmazásokat többszálú lakás használatához kell létrehozni. Az egyszálas lakás használata támogatott, de a lejátszás során az optimálisnál rosszabb teljesítményhez és esetleg akadozáshoz vezet. A C++/WinRT winrt::init_apartment használata esetén a többszálas apartman az alapértelmezett.
A Holographic Remoting NuGet-csomag lekérése
A NuGet-csomag Visual Studióban való hozzáadásához a következő lépések szükségesek.
- Nyissa meg a projektet a Visual Studióban.
- Kattintson a jobb gombbal a projektcsomópontra, és válassza a NuGet-csomagok kezelése... lehetőséget.
- A megjelenő panelen válassza a Tallózás lehetőséget, majd keressen rá a "Holographic Remoting" kifejezésre.
- Válassza a Microsoft.Holographic.Remoting.OpenXr lehetőséget, majd győződjön meg arról, hogy a legújabb 2.x.x verzió van kiválasztva, majd válassza a Telepítés lehetőséget.
- Ha megjelenik az Előnézet párbeszédpanel, válassza az OK gombot.
- Válassza az Elfogadom lehetőséget, amikor megjelenik a licencszerződés párbeszédpanel.
- Ismételje meg a 3–6. lépést a következő NuGet-csomagok esetében: OpenXR.Headers, OpenXR.Loader
Megjegyzés
A NuGet-csomag 1.x.x-es verziója továbbra is elérhető a HoloLens 1-et megcélzó fejlesztők számára. További információ: HoloLens hozzáadása (1. generációs).
Válassza ki a Holographic Remoting OpenXR-futtatókörnyezetet
A távoli alkalmazásban első lépésként válassza ki a Holographic Remoting OpenXR futtatókörnyezetet, amely a Microsoft.Holographic.Remoting.OpenXr NuGet csomag része. Ezt úgy teheti meg, hogy a XR_RUNTIME_JSON
környezeti változót az alkalmazásban található RemotingXR.json fájl elérési útjára állítja. Ezt a környezeti változót az OpenXR-betöltő arra használja, hogy ne a rendszer alapértelmezett OpenXR-futtatókörnyezetét használja, hanem irányítsa át a Holographic Remoting OpenXR-futtatókörnyezetre. A Microsoft.Holographic.Remoting.OpenXr NuGet csomag használatakor a Rendszer automatikusan átmásolja a RemotingXR.json fájlt a kimeneti mappába történő fordítás során, az OpenXR-futtatókörnyezet kiválasztása általában a következőképpen néz ki.
bool EnableRemotingXR() {
wchar_t executablePath[MAX_PATH];
if (GetModuleFileNameW(NULL, executablePath, ARRAYSIZE(executablePath)) == 0) {
return false;
}
std::filesystem::path filename(executablePath);
filename = filename.replace_filename("RemotingXR.json");
if (std::filesystem::exists(filename)) {
SetEnvironmentVariableW(L"XR_RUNTIME_JSON", filename.c_str());
return true;
}
return false;
}
XrInstance létrehozása Holographic Remoting bővítménysel
Egy tipikus OpenXR-alkalmazás első művelete az OpenXR-bővítmények kiválasztása és egy XrInstance létrehozása. Az OpenXR magspecifikációja nem biztosít semmilyen remoting specifikus API-t. Ezért a Holographic Remoting saját OpenXR-bővítményt vezet be.XR_MSFT_holographic_remoting
Győződjön meg arról, hogy XR_MSFT_HOLOGRAPHIC_REMOTING_EXTENSION_NAME
szerepel az xrCreateInstance hívás XrInstanceCreateInfo elemében.
Tipp
Alapértelmezés szerint az alkalmazás renderelt tartalma csak a Holographic Remoting lejátszóba kerül, amely HoloLens 2 vagy Windows Mixed Reality headseten fut. A renderelt tartalom távoli pc-n való megjelenítéséhez például egy ablak felcserélési láncán keresztül a Holographic Remoting egy második OpenXR-bővítményt XR_MSFT_holographic_remoting_frame_mirroring
is biztosít. Győződjön meg arról, hogy ezt a bővítményt is XR_MSFT_HOLOGRAPHIC_REMOTING_FRAME_MIRRORING_EXTENSION_NAME
engedélyezni szeretné arra az esetre, ha használni szeretné ezt a funkciót.
Fontos
A Holographic Remoting OpenXR bővítmény API-val kapcsolatos információkért tekintse meg a Holographic Remoting samples github-adattárban található specifikációt.
Csatlakozás az eszközhöz
Miután a távoli alkalmazás létrehozta az XrInstance-t, és lekérdezte az XrSystemId-et az xrGetSystem-en keresztül, létre lehet hozni egy kapcsolatot a lejátszóeszközrel.
Figyelmeztetés
A Holographic Remoting OpenXR-futtatókörnyezet csak eszközspecifikus adatokat tud megadni, például a konfigurációk megtekintését vagy a környezet keverési módjait a kapcsolat létrejötte után. xrEnumerateViewConfigurations
, xrEnumerateViewConfigurationViews
, xrGetViewConfigurationProperties
, , xrEnumerateEnvironmentBlendModes
és xrGetSystemProperties
alapértelmezett értékeket ad meg, amelyek megegyeznek azzal, amit általában kap, ha egy HoloLens 2 futó játékoshoz csatlakozik, mielőtt teljesen csatlakozna.
Erősen ajánlott, hogy a kapcsolat létrehozása előtt ne hívja meg ezeket a metódusokat. A rendszer ezeket a metódusokat használja az XrSession sikeres létrehozása után, és a munkamenet állapota legalább XR_SESSION_STATE_READY.
Az alábbi módon konfigurálhatók xrRemotingSetContextPropertiesMSFT
olyan általános tulajdonságok, mint a maximális sávszélesség, a hangalapú, a videokodek vagy a mélységi puffer streamfeloldása.
XrRemotingRemoteContextPropertiesMSFT contextProperties;
contextProperties = XrRemotingRemoteContextPropertiesMSFT{static_cast<XrStructureType>(XR_TYPE_REMOTING_REMOTE_CONTEXT_PROPERTIES_MSFT)};
contextProperties.enableAudio = false;
contextProperties.maxBitrateKbps = 20000;
contextProperties.videoCodec = XR_REMOTING_VIDEO_CODEC_H265_MSFT;
contextProperties.depthBufferStreamResolution = XR_REMOTING_DEPTH_BUFFER_STREAM_RESOLUTION_HALF_MSFT;
xrRemotingSetContextPropertiesMSFT(m_instance.Get(), m_systemId, &contextProperties);
A kapcsolat kétféleképpen végezhető el.
- A távoli alkalmazás csatlakozik az eszközön futó lejátszóhoz.
- Az eszközön futó lejátszó csatlakozik a távoli alkalmazáshoz.
Ha kapcsolatot szeretne létesíteni a távoli alkalmazás és a lejátszóeszköz között, hívja meg a xrRemotingConnectMSFT
gazdanevet és a portot a XrRemotingConnectInfoMSFT
struktúrán keresztül megadó metódust. A Holographic Remoting Player által használt port 8265.
XrRemotingConnectInfoMSFT connectInfo{static_cast<XrStructureType>(XR_TYPE_REMOTING_CONNECT_INFO_MSFT)};
connectInfo.remoteHostName = "192.168.x.x";
connectInfo.remotePort = 8265;
connectInfo.secureConnection = false;
xrRemotingConnectMSFT(m_instance.Get(), m_systemId, &connectInfo);
A távoli alkalmazás bejövő kapcsolatainak figyelése a metódus meghívásával xrRemotingListenMSFT
végezhető el. A kézfogási port és az átviteli port is megadható a XrRemotingListenInfoMSFT
szerkezeten keresztül. A kézfogási port a kezdeti kézfogáshoz használatos. Az adatok ezután az átviteli porton keresztül lesznek elküldve. Alapértelmezés szerint a 8265 és a 8266 van használatban.
XrRemotingListenInfoMSFT listenInfo{static_cast<XrStructureType>(XR_TYPE_REMOTING_LISTEN_INFO_MSFT)};
listenInfo.listenInterface = "0.0.0.0";
listenInfo.handshakeListenPort = 8265;
listenInfo.transportListenPort = 8266;
listenInfo.secureConnection = false;
xrRemotingListenMSFT(m_instance.Get(), m_systemId, &listenInfo);
A kapcsolati állapotot le kell választani a híváskor vagy xrRemotingListenMSFT
a híváskorxrRemotingConnectMSFT
. A kapcsolat állapotát bármikor lekérheti, miután létrehozott egy XrInstance-t, és lekérdezte az XrSystemId-et a használatával xrRemotingGetConnectionStateMSFT
.
XrRemotingConnectionStateMSFT connectionState;
xrRemotingGetConnectionStateMSFT(m_instance.Get(), m_systemId, &connectionState, nullptr);
A rendelkezésre álló kapcsolati állapotok a következők:
- XR_REMOTING_CONNECTION_STATE_DISCONNECTED_MSFT
- XR_REMOTING_CONNECTION_STATE_CONNECTING_MSFT
- XR_REMOTING_CONNECTION_STATE_CONNECTED_MSFT
Fontos
xrRemotingConnectMSFT
vagy xrRemotingListenMSFT
meg kell hívni, mielőtt XrSessiont próbálna létrehozni az xrCreateSession használatával. Ha XrSessiont próbál létrehozni, miközben a kapcsolati állapot XR_REMOTING_CONNECTION_STATE_DISCONNECTED_MSFT
a munkamenet létrehozása sikeres lesz, de a munkamenet állapota azonnal XR_SESSION_STATE_LOSS_PENDING lesz.
A Holographic Remoting implementációja támogatja xrCreateSession
a kapcsolat létrehozását. Meghívhatja xrRemotingConnectMSFT
vagy xrRemotingListenMSFT
azonnal követheti a hívását xrCreateSession
, amely letiltja és megvárja a kapcsolat létrejöttét. Az időtúllépés xrRemotingConnectMSFT
10 másodpercre van rögzítve, és korlátlan a használatával xrRemotingListenMSFT
. Ha ez idő alatt létre lehet hozni egy kapcsolatot, az XrSession létrehozása sikeres lesz, és a munkamenet állapota XR_SESSION_STATE_READY lesz. Ha nem hozható létre kapcsolat, a munkamenet létrehozása is sikeres lesz, de azonnal áttér XR_SESSION_STATE_LOSS_PENDING.
A kapcsolat állapota általában az XrSession állapottal párosul. A kapcsolati állapot bármilyen módosítása a munkamenet állapotát is befolyásolja. Ha például a kapcsolati állapot a munkamenet állapotára XR_REMOTING_CONNECTION_STATE_CONNECTED_MSFT
XR_REMOTING_CONNECTION_STATE_DISCONNECTED_MSFT
vált, akkor a XR_SESSION_STATE_LOSS_PENDING is át fog váltani.
Adott események újraegyenlítésének kezelése
A Holographic Remoting OpenXR-futtatókörnyezet három eseményt tesz elérhetővé, amelyek fontosak a kapcsolat állapotának monitorozásához.
XR_TYPE_REMOTING_EVENT_DATA_CONNECTED_MSFT
: Akkor aktiválódik, ha sikerült kapcsolatot létesíteni az eszközzel.XR_TYPE_REMOTING_EVENT_DATA_DISCONNECTED_MSFT
: Akkor aktiválódik, ha egy létrehozott kapcsolat lezárult, vagy nem sikerült kapcsolatot létesíteni.XR_TYPE_REMOTING_EVENT_DATA_LISTENING_MSFT
: Amikor a bejövő kapcsolatokat figyeli, elindul.
Ezek az események egy üzenetsorba kerülnek, és a távoli alkalmazásnak szabályosan kell olvasnia az üzenetsorból a segítségével xrPollEvent
.
auto pollEvent = [&](XrEventDataBuffer& eventData) -> bool {
eventData.type = XR_TYPE_EVENT_DATA_BUFFER;
eventData.next = nullptr;
return CHECK_XRCMD(xrPollEvent(m_instance.Get(), &eventData)) == XR_SUCCESS;
};
XrEventDataBuffer eventData{};
while (pollEvent(eventData)) {
switch (eventData.type) {
...
case XR_TYPE_REMOTING_EVENT_DATA_LISTENING_MSFT: {
DEBUG_PRINT("Holographic Remoting: Listening on port %d",
reinterpret_cast<const XrRemotingEventDataListeningMSFT*>(&eventData)->listeningPort);
break;
}
case XR_TYPE_REMOTING_EVENT_DATA_CONNECTED_MSFT: {
DEBUG_PRINT("Holographic Remoting: Connected.");
break;
}
case XR_TYPE_REMOTING_EVENT_DATA_DISCONNECTED_MSFT: {
DEBUG_PRINT("Holographic Remoting: Disconnected - Reason: %d",
reinterpret_cast<const XrRemotingEventDataDisconnectedMSFT*>(&eventData)->disconnectReason);
break;
}
}
Streamelt tartalom előzetes verziója helyileg
Ha ugyanazt a tartalmat szeretné megjeleníteni a távoli alkalmazásban, amelyet a rendszer az eszközre küld, használhatja a XR_MSFT_holographic_remoting_frame_mirroring
bővítményt. Ezzel a kiterjesztéssel az xrEndFrame-be küldhet textúrát úgy, hogy a XrRemotingFrameMirrorImageInfoMSFT
nem az XrFrameEndInfo-hoz láncolt szerkezetet használja az alábbiak szerint.
XrFrameEndInfo frameEndInfo{XR_TYPE_FRAME_END_INFO};
...
XrRemotingFrameMirrorImageD3D11MSFT mirrorImageD3D11{
static_cast<XrStructureType>(XR_TYPE_REMOTING_FRAME_MIRROR_IMAGE_D3D11_MSFT)};
mirrorImageD3D11.texture = m_window->GetNextSwapchainTexture();
XrRemotingFrameMirrorImageInfoMSFT mirrorImageEndInfo{
static_cast<XrStructureType>(XR_TYPE_REMOTING_FRAME_MIRROR_IMAGE_INFO_MSFT)};
mirrorImageEndInfo.image = reinterpret_cast<const XrRemotingFrameMirrorImageBaseHeaderMSFT*>(&mirrorImageD3D11);
frameEndInfo.next = &mirrorImageEndInfo;
xrEndFrame(m_session.Get(), &frameEndInfo);
m_window->PresentSwapchain();
A fenti példa egy DX11 felcserélési lánc textúráját használja, és közvetlenül az xrEndFrame hívása után jeleníti meg az ablakot. A használat nem korlátozódik a láncok szerkezetének felcserélésére. Továbbá nincs szükség további GPU-szinkronizálásra. A használattal és a korlátozásokkal kapcsolatos részletekért tekintse meg a bővítmény specifikációját. Ha a távoli alkalmazás DX12-t használ, használja az XrRemotingFrameMirrorImageD3D12MSFT függvényt az XrRemotingFrameMirrorImageD3D11MSFT helyett.
Nem kötelező: Egyéni adatcsatornák
A 2.5.0-s verziótól kezdődően az OpenXR API-val egyéni adatcsatornák használhatók felhasználói adatok küldésére a már létrehozott újrakapcsolódási kapcsolaton keresztül. További információ: Egyéni adatcsatornák az OpenXR API-val.
Nem kötelező: Beszédfelismerés
A 2.6.0-s verziótól kezdődően a XR_MSFT_holographic_remoting_speech
bővítmény lehetővé teszi, hogy a távoli alkalmazás reagáljon a lejátszóalkalmazás által az OpenXR API-val észlelt beszédparancsra.
[! FONTOS] A részletes specifikáció a Holographic Remoting samples GitHub-adattárban található.
A lejátszóalkalmazás beszédfelismerőjének inicializálásához a távoli alkalmazás meghívhatja a következőt xrInitializeRemotingSpeechMSFT
: .
Ez a hívás továbbítja a beszéd inicializálási paramétereit, amelyek egy nyelvből, egy kifejezésszótárból és egy nyelvtani fájl tartalmából állnak a lejátszóalkalmazásnak.
Megjegyzés
A 2.6.1-es verzió előtt a beszédfelismerőt csak egyszer kell inicializálni.XrSession
Ha a beszédfelismerő létrehozása sikeres volt az esemény által XR_TYPE_EVENT_DATA_REMOTING_SPEECH_RECOGNIZER_STATE_CHANGED_MSFT
jelzett módon, a távoli alkalmazás értesítést kap, amikor beszédfelismerési eredmény jött létre a lejátszóalkalmazásban.
Az XrEventDataRemotingSpeechRecognizerStateChangedMSFT
eseménystruktúra akkor kerül az eseménysorba, amikor a beszédfelismerő állapota megváltozik a játékos oldalán.
XrRemotingSpeechRecognizerStateMSFT
Meghatározza a beszédfelismerő összes lehetséges állapotát a játékos oldalán, és az XrEventDataRemotingSpeechRecognizedMSFT
eseménystruktúrát az eseménysorba helyezi, ha a beszédfelismerő a játékos oldalán felismert kifejezéssel rendelkezik.
Miután a távoli alkalmazás értesítést kap egy felismert kifejezésről, a meghívásával xrRetrieveRemotingSpeechRecognizedTextMSFT
lekérheti a felismert kifejezést.
Megjegyzés
A XrRemotingSpeechRecognitionConfidenceMSFT
a SpeechRecognitionConfidence szám közvetlen leképezése, amelyet a Windows Speech Recognition API beszédfelismerési eredményével ad vissza.
Nem kötelező: A rendszerszinkronizálás koordinálása
A 2.7.0-s verziótól kezdve a koordinátarendszer-szinkronizálás használható a térbeli adatok a lejátszó és a távoli alkalmazás közötti igazítására. További információ: A rendszerszinkronizálás koordinálása holografikus újraegyenlítéssel – áttekintés.