Anpassade datakanaler med Holographic Remoting och OpenXR API

Använd anpassade datakanaler för att skicka anpassade data via en etablerad fjärrkommunikationsanslutning.

Viktigt

Anpassade datakanaler kräver en anpassad fjärrapp och en anpassad spelarapp. Detta möjliggör kommunikation mellan de två anpassade apparna.

Tips

Ett enkelt ping-pong-exempel finns i fjärr- och spelarexemplen i GitHub-lagringsplatsen Holographic Remoting Samples. Ta bort kommentar #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE i OpenXrProgramm.cpp- och SamplePlayerMain.h-filerna för att aktivera exempelkoden.

Skapa en anpassad datakanal

En anpassad datakanal definieras av referensen XrRemotingDataChannelMSFT :

XrRemotingDataChannelMSFT m_userDataChannel;

När en anslutning har upprättats kan nya datakanaler skapas via xrCreateRemotingDataChannelMSFT funktionen :

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

Anpassade datakanaler kan skapas från spelaren och fjärrprogrammet även om körningsmiljöerna skiljer sig åt. Om en datakanal skapas av spelarsidan meddelas fjärrsidan med XrEventDataRemotingDataChannelCreatedMSFT händelsestrukturen:

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

Det första XrRemotingDataChannelStatusMSFT tillståndet efter anropet xrCreateRemotingDataChannelMSFT är XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT. När datakanalen har upprättats helt växlar kanalens tillstånd till XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT. Händelsestrukturen XrEventDataRemotingDataChannelOpenedMSFT placeras i händelsekön när tillståndet för en tidigare skapad datakanal växlar från XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT till XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT.

Hämta kanaltillståndet

Funktionen xrGetRemotingDataChannelStateMSFT kan användas för att fråga datakanaltillståndet:

XrRemotingDataChannelStateMSFT channelState{static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_STATE_MSFT)};
CHECK_XRCMD(m_extensions.xrGetRemotingDataChannelStateMSFT(m_userDataChannel, &channelState));

Skicka data

Om kanalen är öppen xrSendRemotingDataMSFT används funktionen för att skicka data till spelarsidan:

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

Anteckning

De data som du skickar via en anpassad datakanal delar bandbredden med andra datakanaler som Holographic Remoting använder.

Hämta data

Varje gång data tas emot via en datakanal placeras en XrEventDataRemotingDataChannelDataReceivedMSFT händelsestruktur i händelsekön. Mottagna paket kan hämtas med funktionen xrRetrieveRemotingDataMSFT :

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

Förstöra en datakanal

Du kan förstöra en datakanal med xrDestroyRemotingDataChannelMSFT:

CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));

Handtaget XrRemotingDataChannelMSFT är ogiltigt efter anropet xrDestroyRemotingDataChannelMSFT och datakanalreferensen får inte användas efteråt.

XrEventDataRemotingDataChannelClosedMSFT placeras i händelsekön om spelarsidan stänger eller förstör datakanalen. Datakanalens tillstånd växlar till XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT. För en stängd datakanal XrRemotingDataChannelMSFT förblir handtaget giltigt.

Se även