Aangepaste gegevenskanalen met holografische externe communicatie en de OpenXR-API

Gebruik aangepaste gegevenskanalen om aangepaste gegevens te verzenden via een tot stand gebrachte externe verbinding.

Belangrijk

Aangepaste gegevenskanalen vereisen een aangepaste externe app en een aangepaste speler-app. Dit maakt communicatie tussen de twee aangepaste apps mogelijk.

Tip

Een eenvoudig voorbeeld van pingpong is te vinden in de voorbeelden voor externe en spelers in de GitHub-opslagplaats holographic Remoting samples. Verwijder de opmerking #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE in de bestanden OpenXrProgramm.cpp en SamplePlayerMain.h om de voorbeeldcode in te schakelen.

Notitie

De gedetailleerde specificatie vindt u in de GitHub-opslagplaats holographic Remoting-voorbeelden.

Een aangepast gegevenskanaal maken

Een aangepast gegevenskanaal wordt gedefinieerd door de XrRemotingDataChannelMSFT ingang:

XrRemotingDataChannelMSFT m_userDataChannel;

Nadat een verbinding tot stand is gebracht, kunnen nieuwe gegevenskanalen worden gemaakt via de xrCreateRemotingDataChannelMSFT functie:

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

Aangepaste gegevenskanalen kunnen worden gemaakt vanuit de speler en de externe toepassing, zelfs als de runtimes verschillen. Als een gegevenskanaal wordt gemaakt door de spelerzijde, wordt de externe zijde op de hoogte gesteld met de XrEventDataRemotingDataChannelCreatedMSFT gebeurtenisstructuur:

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

De beginstatus XrRemotingDataChannelStatusMSFT na het aanroepen xrCreateRemotingDataChannelMSFT is XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT. Zodra het gegevenskanaal volledig tot stand is gebracht, schakelt de status van het kanaal over naar XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT. De XrEventDataRemotingDataChannelOpenedMSFT gebeurtenisstructuur wordt in de gebeurteniswachtrij geplaatst wanneer de status van een eerder gemaakt gegevenskanaal overschakelt van XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT naar XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT.

De kanaalstatus ophalen

De xrGetRemotingDataChannelStateMSFT functie kan worden gebruikt om een query uit te voeren op de status van het gegevenskanaal:

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

Gegevens verzenden

Als het kanaal is geopend, wordt de xrSendRemotingDataMSFT functie gebruikt om gegevens naar de speler te verzenden:

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

Notitie

De gegevens die u via een aangepast gegevenskanaal verzendt, delen de bandbreedte met andere gegevenskanalen die holographic remoting gebruikt.

Gegevens ophalen

Telkens wanneer gegevens binnenkomen via een gegevenskanaal, wordt er een XrEventDataRemotingDataChannelDataReceivedMSFT gebeurtenisstructuur in de gebeurteniswachtrij geplaatst. Ontvangen pakketten kunnen worden opgehaald met de xrRetrieveRemotingDataMSFT functie:

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

Een gegevenskanaal vernietigen

U kunt een gegevenskanaal vernietigen met xrDestroyRemotingDataChannelMSFT:

CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));

De XrRemotingDataChannelMSFT ingang is ongeldig na de xrDestroyRemotingDataChannelMSFT aanroep en de ingang van het gegevenskanaal mag daarna niet meer worden gebruikt.

De XrEventDataRemotingDataChannelClosedMSFT wordt in de gebeurteniswachtrij geplaatst voor het geval de speler het gegevenskanaal sluit of vernietigt. De status van het gegevenskanaal wordt overgeschakeld naar XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT. Voor een gesloten gegevenskanaal blijft de XrRemotingDataChannelMSFT ingang geldig.

Zie ook