Sdílet prostřednictvím


Vlastní datové kanály s Holographic Remotingem a rozhraním OpenXR API

K odesílání vlastních dat přes navázané vzdálené připojení použijte vlastní datové kanály.

Důležité

Vlastní datové kanály vyžadují vlastní vzdálenou aplikaci a vlastní aplikaci přehrávače. To umožňuje komunikaci mezi těmito dvěma vlastními aplikacemi.

Tip

Jednoduchý příklad ping-pong najdete v ukázkách remote a player v úložišti GitHubu s ukázkami Holographic Remoting. Zrušením komentáři #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE v souborech OpenXrProgramm.cpp a SamplePlayerMain.h povolte vzorový kód.

Vytvoření vlastního datového kanálu

Vlastní datový kanál je definován popisovačem XrRemotingDataChannelMSFT :

XrRemotingDataChannelMSFT m_userDataChannel;

Po úspěšném navázání připojení je možné vytvořit nové datové kanály prostřednictvím xrCreateRemotingDataChannelMSFT funkce :

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

Vlastní datové kanály je možné vytvořit z přehrávače a vzdálené aplikace i v případě, že se moduly runtime liší. Pokud je datový kanál vytvořen na straně přehrávače, vzdálená strana je upozorněna strukturou XrEventDataRemotingDataChannelCreatedMSFT události:

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

Počáteční XrRemotingDataChannelStatusMSFT stav po volání xrCreateRemotingDataChannelMSFT je XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT. Po úplném vytvoření datového kanálu se stav kanálu přepne na XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT. Struktura XrEventDataRemotingDataChannelOpenedMSFT událostí se umístí do fronty událostí, když se stav dříve vytvořeného datového kanálu přepne z XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT na XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT.

Získání stavu kanálu

Funkci xrGetRemotingDataChannelStateMSFT je možné použít k dotazování stavu datového kanálu:

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

Odeslat data

Pokud je kanál otevřený, xrSendRemotingDataMSFT použije se funkce k odesílání dat na stranu přehrávače:

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

Poznámka

Data odesílaná přes vlastní datový kanál sdílí šířku pásma s jinými datovými kanály, které Holographic Remoting používá.

Načtení dat

Pokaždé, když data přicházejí přes datový kanál, XrEventDataRemotingDataChannelDataReceivedMSFT se struktura událostí umístí do fronty událostí. Přijaté pakety je možné načíst pomocí xrRetrieveRemotingDataMSFT funkce :

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

Zničení datového kanálu

Datový kanál můžete zničit pomocí xrDestroyRemotingDataChannelMSFTpříkazu :

CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));

Popisovač XrRemotingDataChannelMSFT je po xrDestroyRemotingDataChannelMSFT volání neplatný a popisovač datového kanálu nesmí být použit později.

Objekt XrEventDataRemotingDataChannelClosedMSFT se umístí do fronty událostí pro případ, že by se strana hráče zavřela nebo zničila datový kanál. Stav datového kanálu se přepne na XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT. U uzavřeného datového XrRemotingDataChannelMSFT kanálu zůstane popisovač platný.

Viz také