Megosztás a következőn keresztül:


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_MSFTvá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 xrDestroyRemotingDataChannelMSFTsemmisí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_MSFTvált: . Lezárt adatcsatorna esetén a XrRemotingDataChannelMSFT leíró érvényes marad.

Lásd még: