Egyéni adatcsatornák Holographic Remoting és az OpenXR API használatával
Egyéni adatcsatornák használatával egyéni adatokat küldhet egy létrehozott újrakapcsolódási kapcsolaton keresztül.
Fontos
Az egyéni adatcsatornákhoz egyéni távoli alkalmazás és egyéni lejátszóalkalmazás szükséges. Ez lehetővé teszi a két egyéni alkalmazás közötti kommunikációt.
Tipp
Egy egyszerű pingpongpongpélda található a Holographic Remoting samples GitHub-adattárban található távoli és lejátszómintákban.
A mintakód engedélyezéséhez törölje a megjegyzést #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE
az OpenXrProgramm.cpp és a SamplePlayerMain.h fájlokból.
Megjegyzés
A részletes specifikáció a Holographic Remoting samples GitHub-adattárban található.
Egyéni adatcsatorna létrehozása
Az egyéni adatcsatornát a XrRemotingDataChannelMSFT
leíró határozza meg:
XrRemotingDataChannelMSFT m_userDataChannel;
A kapcsolat sikeres létrehozása után új adatcsatornák hozhatók létre a xrCreateRemotingDataChannelMSFT
függvényen keresztül:
XrRemotingDataChannelCreateInfoMSFT channelInfo{static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_CREATE_INFO_MSFT)};
channelInfo.channelId = 0;
channelInfo.channelPriority = XR_REMOTING_DATA_CHANNEL_PRIORITY_LOW_MSFT;
CHECK_XRCMD(m_extensions.xrCreateRemotingDataChannelMSFT(m_instance.Get(), m_systemId, &channelInfo, &m_userDataChannel));
Egyéni adatcsatornák akkor is létrehozhatók a lejátszóból és a távoli alkalmazásból, ha a futtatókörnyezetek eltérőek.
Ha egy adatcsatornát a lejátszóoldal hoz létre, a távoli oldal értesítést kap az XrEventDataRemotingDataChannelCreatedMSFT
esemény szerkezetéről:
XrEventDataBuffer eventData{};
while (pollEvent(eventData))
{
switch (eventData.type)
{
case XR_TYPE_EVENT_DATA_REMOTING_DATA_CHANNEL_CREATED_MSFT:
{
auto channelCreatedEventData = reinterpret_cast<const XrEventDataRemotingDataChannelCreatedMSFT*>(&eventData);
m_userDataChannel = channelCreatedEventData->channel;
break;
}
}
}
A hívás utáni kezdeti XrRemotingDataChannelStatusMSFT
állapot a következő: XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT
.xrCreateRemotingDataChannelMSFT
Az adatcsatorna teljes létrehozása után a csatorna állapota átvált a következőre XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT
: .
Az XrEventDataRemotingDataChannelOpenedMSFT
eseménystruktúra akkor kerül az eseménysorba, amikor egy korábban létrehozott adatcsatorna állapota a-ról XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT
a -ra XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT
vált.
A csatorna állapotának lekérése
A xrGetRemotingDataChannelStateMSFT
függvény az adatcsatorna állapotának lekérdezésére használható:
XrRemotingDataChannelStateMSFT channelState{static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_STATE_MSFT)};
CHECK_XRCMD(m_extensions.xrGetRemotingDataChannelStateMSFT(m_userDataChannel, &channelState));
Adatok küldése
Ha a csatorna nyitva van, a xrSendRemotingDataMSFT
függvény adatokat küld a lejátszó oldalára:
if (channelState.connectionStatus == XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT) {
// Only send the packet if the send queue is smaller than 1MiB
if (channelState.sendQueueSize >= 1 * 1024 * 1024) {
return;
}
uint8_t data[] = {1};
XrRemotingDataChannelSendDataInfoMSFT sendInfo{
static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_SEND_DATA_INFO_MSFT)};
sendInfo.data = data;
sendInfo.size = sizeof(data);
sendInfo.guaranteedDelivery = true;
CHECK_XRCMD(m_extensions.xrSendRemotingDataMSFT(m_userDataChannel, &sendInfo));
}
Megjegyzés
Az egyéni adatcsatornán keresztül küldött adatok megosztják a sávszélességet más adatcsatornákkal Holographic Remoting használatával.
Adatok lekérése
Minden alkalommal, amikor az adatok adatcsatornán keresztül érkeznek, egy XrEventDataRemotingDataChannelDataReceivedMSFT
eseménystruktúra kerül az eseménysorba.
A fogadott csomagok lekérhetők a xrRetrieveRemotingDataMSFT
függvénnyel:
XrEventDataBuffer eventData{};
while (pollEvent(eventData))
{
switch (eventData.type)
{
case XR_TYPE_EVENT_DATA_REMOTING_DATA_CHANNEL_DATA_RECEIVED_MSFT:
{
auto dataReceivedEventData = reinterpret_cast<const XrEventDataRemotingDataChannelDataReceivedMSFT*>(&eventData);
std::vector<uint8_t> packet(dataReceivedEventData->size);
uint32_t dataBytesCount;
CHECK_XRCMD(m_extensions.xrRetrieveRemotingDataMSFT(dataReceivedEventData->channel,
dataReceivedEventData->packetId,
static_cast<uint32_t>(packet.size()),
&dataBytesCount,
packet.data()));
break;
}
}
}
Adatcsatorna megsemmisítése
Az adatcsatornát a következővel xrDestroyRemotingDataChannelMSFT
semmisítheti meg:
CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));
A XrRemotingDataChannelMSFT
leíró a xrDestroyRemotingDataChannelMSFT
hívás után érvénytelen, és az adatcsatorna-leírót később nem szabad használni.
A XrEventDataRemotingDataChannelClosedMSFT
az eseménysorba kerül arra az esetre, ha a játékosoldal bezárja vagy megsemmisíti az adatcsatornát.
Az adatcsatorna állapota a következőre XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT
vált: .
Lezárt adatcsatorna esetén a XrRemotingDataChannelMSFT
leíró érvényes marad.