Egyéni Holographic Remoting lejátszóalkalmazás írása

Ha még csak most olvassa el a Holographic Remotingot, olvassa el az áttekintést.

Fontos

Ez a dokumentum a 2. HoloLens egyéni lejátszóalkalmazás létrehozását ismerteti. A 2. HoloLens írt egyéni lejátszók nem kompatibilisek az 1. HoloLens írt távoli alkalmazásokkal. Ez azt jelenti, hogy mindkét alkalmazásnak a NuGet-csomag 2.x.x verzióját kell használnia.

Ha létrehoz egy egyéni Holographic távelérési lejátszóalkalmazást, létrehozhat egy olyan egyéni alkalmazást, amely képes a 2. HoloLens távoli gépén modern nézeteket megjeleníteni. Az oldalon található összes kód és munkaprojekt megtalálható a Holographic Remoting samples github repository (Holographic Remoting-minták github-adattárában).

A Holographic remoting player (Holographic Remoting Player) lehetővé teszi, hogy az alkalmazás olyan holografikus tartalmakat jelenítsen meg egy asztali számítógépen vagy UWP-eszközön, mint a Xbox One, és több rendszererőforráshoz fér hozzá. A Holographic távoli távoli lejátszóalkalmazás a bemeneti adatokat egy Holographic Távoli távoli alkalmazásba streamel, és a magával ragadó nézetet videó- és hangstreamként fogadja. A kapcsolat a standard Wi-Fi használatával létesítve. Lejátszóalkalmazás létrehozásához egy NuGet-csomaggal adja hozzá a Holographic Remotingot az UWP-alkalmazáshoz. Ezután írjon kódot a kapcsolat kezeléséhez és a modern nézet megjelenítéséhez.

Előfeltételek

Jó kiindulási pont egy működő DirectX-alapú UWP-alkalmazás, amely már a Windows Mixed Reality API-t célozza. Részletekért lásd a DirectX-fejlesztés áttekintését. Ha még nem létezik alkalmazás, és nulláról szeretné kezdeni, a C++ holografikus projektsablon jó kiindulási pont lehet.

Fontos

A Holographic Remotingot használó alkalmazásokat többszálas topikának kell használniuk. Az egyszálas oltó használata támogatott, de az optimálisnál nem optimális teljesítményt eredményez, és a lejátszás során akár meg is akad. C++/WinRT winrt::init_apartment az alapértelmezett többszálas rendszer.

A Holographic eltolásos NuGet-csomag lekért része

A NuGet-csomag projekthez való hozzáadásához a következő lépések szükségesek a Visual Studio.

  1. Nyissa meg a projektet a Visual Studióban.
  2. Kattintson a jobb gombbal a projektcsomópontra, és válassza a Manage NuGet Packages... (NuGet-csomagok kezelése... lehetőséget)
  3. A megjelenő panelen válassza a Tallózás lehetőséget, majd keressen rá a "Holographic Remoting" kifejezésre.
  4. Válassza a Microsoft.Holographic.Remotinglehetőséget, válassza ki a legújabb 2.x.x verziót, és válassza az Install (Telepítés) lehetőséget.
  5. Ha megjelenik az Előnézet párbeszédpanel, kattintson az OK gombra.
  6. Válassza az Elfogadom lehetőséget, amikor megjelenik a licencszerződés párbeszédpanel.

Fontos

A build\native\include\HolographicAppRemoting\Microsoft.Holographic.AppRemoting.idl NuGet-csomagban található a Holographic Remoting által elérhetővéált API részletes dokumentációja.

Az alkalmazás Package.appxmanifest-ének módosítása

Ahhoz, hogy az alkalmazás értesülni Microsoft.Holographic.AppRemoting.dll NuGet-csomag által hozzáadott alkalmazásról, a következő lépéseket kell követnie a projekten:

  1. A Megoldáskezelő kattintson a jobb gombbal a Package.appxmanifest fájlra, és válassza az Open With... (Megnyitás a következővel... lehetőséget)
  2. Válassza az XML (Szöveg) szerkesztőt, majd kattintson az OK gombra.
  3. Adja hozzá a következő sorokat a fájlhoz, és mentse
  </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>

A lejátszókörnyezet létrehozása

Első lépésként az alkalmazásnak létre kell hoznia egy lejátszókörnyezetet.

// 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();

Figyelmeztetés

A Holographic Remoting úgy működik, hogy a Windows Mixed Reality-Windows részét képezi, és egy adott futásidejű eltolást futtat. Ez a lejátszókörnyezet létrehozása során történik. Emiatt a lejátszókörnyezet létrehozása előtt bármilyen Windows Mixed Reality API-n való hívás váratlan viselkedést eredményezhet. Javasoljuk, hogy a lejátszókörnyezetet a lehető leghamarabb hozza létre, mielőtt bármilyen API-val Mixed Reality interakciót. Soha ne keverje a hívás előtt létrehozott vagy lekért Windows Mixed Reality api-n keresztül létrehozott vagy PlayerContext::Create lekért objektumokat a hívása előtt.

Ezután a HolographicSpace a HolographicSpace.CreateForCoreWindowhívásával hozható létre.

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

Csatlakozás a távoli alkalmazáshoz

Ha a lejátszóalkalmazás készen áll a tartalom megjelenítésére, létrejön egy kapcsolat a távoli alkalmazással.

A kapcsolat a következő módokon létesítható:

  1. A 2. HoloLens futó lejátszóalkalmazás csatlakozik a távoli alkalmazáshoz.
  2. A távoli alkalmazás a 2. HoloLens futó lejátszóalkalmazáshoz csatlakozik.

Ha csatlakozni szeretne a lejátszóalkalmazásból a távoli alkalmazáshoz, hívja meg a metódust a lejátszókörnyezetben, és adja meg a Connect gazdagépnevet és a portot. Az alapértelmezett port a 8265.

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()
}

Fontos

A C++/WinRT API-khoz hresult_error Connect winrt::hresult_error, amelyet kezelni kell.

A lejátszóalkalmazás bejövő kapcsolatainak figyelése a metódus hívásával Listen történik. A hívás során a kézfogási port és az átviteli port is meg lehet adni. A kézfogási port a kezdeti kézfogáshoz használatos. Az adatokat ezután az átviteli porton keresztül küldi el a rendszer. A rendszer alapértelmezés szerint a 8265-ös és a 8266-os portszámot használja.

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()
}

A PlayerContext három eseményt fed fel a kapcsolat állapotának figyelése során

  1. OnConnected: Akkor aktiválódik, ha sikeresen létrejött a kapcsolat a távoli alkalmazással.
m_onConnectedEventToken = m_playerContext.OnConnected([]() 
{
    // Handle connection successfully established
});
  1. OnDisconnected: Akkor aktiválódik, ha egy már létrehozott kapcsolat megszakad, vagy nem sikerült létrehozni a kapcsolatot.
m_onDisconnectedEventToken = m_playerContext.OnDisconnected([](ConnectionFailureReason failureReason)
{
    switch (failureReason)
    {
        // Handle connection failed or terminated.
        // See ConnectionFailureReason for possible reasons.
    }
}

Megjegyzés

A ConnectionFailureReason lehetséges értékeket a fájl Microsoft.Holographic.AppRemoting.idlConnectionFailureReason

  1. OnListening (Figyeléskor): Elindul a bejövő kapcsolatok figyelése.
m_onListeningEventToken = m_playerContext.OnListening([]()
{
    // Handle start listening for incoming connections
});

A kapcsolat állapota a lejátszókörnyezet tulajdonságával ConnectionState is lekérdezhető.

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

A távolról renderelt képkocka megjelenítése

A távolról renderelt tartalom megjelenítéséhez hívja meg a hívást PlayerContext::BlitRemoteFrame a PlayerContext::BlitRemoteFrame

BlitRemoteFrame A megköveteli, hogy az aktuális HolographicFrame háttérpuffere renderelési célként van kötve. A háttérpuffer a HolographicCameraRenderingParameterstől a Direct3D11BackBuffer tulajdonságon keresztül érhető el.

A hívva a távoli alkalmazás legfrissebb fogadott képkockáját másolja a BlitRemoteFrame HolographicFrame BackBufferébe. A fókuszpont-készlet akkor is be van állítva, ha a távoli alkalmazás adott meg fókuszpontot a távoli képkocka renderelése során.

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

Megjegyzés

PlayerContext::BlitRemoteFrame A felülírhatja az aktuális képkocka fókuszpontját.

Sikeres értéken a értéket BlitRemoteFrame adja BlitResult::Success_Color vissza. Ellenkező esetben a hiba okát adja vissza:

  • BlitResult::Failed_NoRemoteFrameAvailable: Nem sikerült, mert nincs elérhető távoli képkocka.
  • BlitResult::Failed_NoCamera: Sikertelen, mert nincs kamera.
  • BlitResult::Failed_RemoteFrameTooOld: Sikertelen, mert a távoli keret túl régi (lásd a PlayerContext::BlitRemoteFrameTimeout tulajdonságot).

Fontos

A 2.1.0-s verziótól kezdődően egy egyéni lejátszóval mélységi reprodukálás is használható a Holographic Remoting használatával.

BlitResult A a következő BlitResult::Success_Color_Depth feltételek mellett is visszatérhet:

Ha ezek a feltételek teljesülnek, a a távoli mélységet a jelenleg kötött helyi mélységi BlitRemoteFrame pufferbe ássa. Ezután további helyi tartalmakat renderelhet, amelyek mélységi metszetét a távoli renderelt tartalommal lehet ásni. Emellett véglegesheti a helyi mélységi puffert a HolographicCameraRenderingParameters.CommitDirect3D11DepthBuffer segítségével az egyéni lejátszóban, hogy részletesen reprodukálja a távoli és helyileg renderelt tartalmakat.

Leképezés átalakítási módja

Az egyik probléma, amely a Holographic Remotingon keresztüli mélységi újraejátításkor jelenik meg, az az, hogy a távoli tartalom más leképezési átalakítással is megjeleníthető, mint az egyéni lejátszóalkalmazás által közvetlenül renderelt helyi tartalom. Gyakori eset, hogy különböző értékeket kell megadni a kis és távoli síkhoz (HolographicCamera::SetNearPlaneDistance és HolographicCamera::SetFarPlaneDistance)a lejátszó és a távoli oldalon. Ebben az esetben nem egyértelmű, hogy a lejátszó oldalán lévő leképezés-átalakításnak a távoli, közel/távol sík távolságát vagy a helyieket kell-e tükröznie.

A 2.1.0-s verziótól kezdődően a leképezés átalakítási módját a segítségével szabályozhatja. A támogatott értékek a következőek:

  • Local - Local leképezés-átalakítást ad vissza, amely az egyéni lejátszóalkalmazás által a HolographicCamera-on beállított közel/távol sík távolságát tükrözi.
  • Remote – A leképezés átalakítása a távoli alkalmazás által megadott közel/távol sík távolságát tükrözi.
  • Merged – A távoli alkalmazástól és az egyéni lejátszóalkalmazástól való távolság közel/távolról egyesül. Ez alapértelmezés szerint a közelsík távolságának és a távol sík távolságának maximális értékének a meghozásán történik. Abban az esetben, ha a távoli vagy a helyi oldal fel van fordítva, például távolról, a távoli, közel/távol sík távolsága < felfordul.

Nem kötelező: A BlitRemoteFrameTimeout beállítása

Fontos

PlayerContext::BlitRemoteFrameTimeoutA a PlayerContext::BlitRemoteFrameTimeout

A tulajdonság azt adja meg, hogy mennyi ideig használja újra a rendszer a távoli keretet, ha PlayerContext::BlitRemoteFrameTimeout nem érkezik új távoli képkocka.

Gyakori eset, hogy a BlitRemoteFrame időtúllépésének engedélyezésével üres képernyőt jelenítsen meg, ha egy bizonyos ideig nem érkezik új képkockák. Ha engedélyezve van, a metódus visszatérési típusa is használható a helyileg renderelt BlitRemoteFrame tartalék tartalomra való váltáshoz.

Az időtúllépés engedélyezéséhez állítsa a tulajdonság értékét egy 100 ms vagy annál nagyobb időtartamra. Az időtúllépés letiltásához állítsa a tulajdonságot nulla időtartamra. Ha az időtúllépés engedélyezve van, és nem érkezik távoli képkocka a beállított időtartamra, a BlitRemoteFrame sikertelen lesz, és egy új távoli képkocka be nem Failed_RemoteFrameTooOld érkezik.

using namespace std::chrono_literals;

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

Nem kötelező: Az utolsó távoli képkocka statisztikáinak lekért száma

A teljesítmény- vagy hálózati problémák diagnosztizálásához az utolsó távoli képkocka statisztikáit a tulajdonságon keresztül lehet PlayerContext::LastFrameStatistics lekérni. A statisztikák a HolographicFrame::P ResentUsingCurrentPrediction hívása során frissülnek.

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

További információt a fájl PlayerFrameStatistics dokumentációjában Microsoft.Holographic.AppRemoting.idlPlayerFrameStatistics

Nem kötelező: Egyéni adatcsatornák

Az egyéni adatcsatornák felhasználói adatok küldhetők a már létrehozott kapcsolaton keresztül. További információ: egyéni adatcsatornák.

Nem kötelező: Over-Rendering

A Holographic Remoting azt jelzi előre, hogy hol lesz a felhasználó feje, amikor a renderelt képek megjelennek a kijelzőkön. Ez az előrejelzés azonban egy közelítés. Ezért a távoli alkalmazás előrejelált nézete és a lejátszóalkalmazás későbbi tényleges nézete eltérhet. Az erősebb eltérések (például a kiszámíthatatlan mozgás miatt) fekete régiókat okozhatnak a megtekintési frustum határain. A 2.6.0-s verziótól kezdődően a Over-Rendering használatával csökkentheti a fekete régiókat, és mesterségesen javíthatja a vizuális minőséget a megtekintési frustumon túli vizuális megjelenítés mesterséges növelésével.

Over-Rendering a segítségével PlayerContext::ConfigureOverRendering engedélyezhető.

A törtméret-növekedést ad meg a tényleges nézetportra, így az előrejelezni kívánt nézet mérete nagyobb lesz, és kisebb OverRenderingConfig lesz a vágás. A nagyobb nézőpontmérettel a képpont sűrűsége csökken, így az OverRenderingConfig lehetővé teszi a felbontás növelését is. Ha a nézetablak növelése megegyezik a felbontással, a képpont sűrűsége változatlan marad. OverRenderingConfig A a következőként van definiálva:

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).
};

Nem kötelező: Rendszerszinkronizálás koordinálása

A 2.7.0-s verziótól kezdődően a koordinátarendszer-szinkronizálással a térbeli adatok igazíthatóak a lejátszó és a távoli alkalmazás között. További információ: A rendszerszinkronizálás koordinálása holografikus elotolással – áttekintés.

Lásd még: