Canais de Dados Personalizados com Comunicação Remota Holográfica e a API OpenXR

Utilize canais de dados personalizados para enviar dados personalizados através de uma ligação remota estabelecida.

Importante

Os canais de dados personalizados requerem uma aplicação remota personalizada e uma aplicação de leitor personalizada. Isto permite a comunicação entre as duas aplicações personalizadas.

Dica

Pode encontrar um exemplo de pingue-pongue simples nos exemplos remoto e de leitor no repositório github de exemplos de Comunicação Remota Holográfica. Anule o comentário #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE nos ficheiros OpenXrProgramm.cpp e SamplePlayerMain.h para ativar o código de exemplo.

Criar um Canal de Dados Personalizado

Um canal de dados personalizado é definido pelo XrRemotingDataChannelMSFT identificador:

XrRemotingDataChannelMSFT m_userDataChannel;

Depois de uma ligação ser estabelecida com êxito, podem ser criados novos canais de dados através da xrCreateRemotingDataChannelMSFT função :

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

Os canais de dados personalizados podem ser criados a partir do leitor e da aplicação remota, mesmo que os runtimes sejam diferentes. Se um canal de dados for criado pelo lado do leitor, o lado remoto será notificado com a estrutura do XrEventDataRemotingDataChannelCreatedMSFT evento:

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

O estado inicial XrRemotingDataChannelStatusMSFT após chamar xrCreateRemotingDataChannelMSFT é XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT. Assim que o canal de dados estiver totalmente estabelecido, o estado do canal muda para XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT. A XrEventDataRemotingDataChannelOpenedMSFT estrutura de eventos é colocada na fila de eventos quando o estado de um canal de dados criado anteriormente muda de XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT para XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT.

Obter o Estado do Canal

A xrGetRemotingDataChannelStateMSFT função pode ser utilizada para consultar o estado do canal de dados:

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

Enviar Dados

Se o canal estiver aberto, a xrSendRemotingDataMSFT função é utilizada para enviar dados para o lado do leitor:

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

Nota

Os dados que envia através de um canal de dados personalizado partilham a largura de banda com outros canais de dados utilizados pela Comunicação Remota Holográfica.

Obter Dados

Sempre que os dados chegam através de um canal de dados, é colocada uma XrEventDataRemotingDataChannelDataReceivedMSFT estrutura de eventos na fila de eventos. Os pacotes recebidos podem ser obtidos com a xrRetrieveRemotingDataMSFT função :

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

Destruir um Canal de Dados

Pode destruir um canal de dados com xrDestroyRemotingDataChannelMSFT:

CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));

O XrRemotingDataChannelMSFT identificador é inválido após a xrDestroyRemotingDataChannelMSFT chamada e a alça do canal de dados não pode ser utilizada posteriormente.

O XrEventDataRemotingDataChannelClosedMSFT será colocado na fila de eventos caso o lado do jogador feche ou destrua o canal de dados. O estado do canal de dados muda para XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT. Para um canal de dados fechado, o XrRemotingDataChannelMSFT identificador permanece válido.

Consulte também