Canais de dados personalizados com comunicação remota holográfica e a API OpenXR

Use canais de dados personalizados para enviar dados personalizados por meio de uma conexão de comunicação remota estabelecida.

Importante

Os canais de dados personalizados exigem um aplicativo remoto personalizado e um aplicativo de player personalizado. Isso permite a comunicação entre os dois aplicativos personalizados.

Dica

Um exemplo simples de ping-pong pode ser encontrado nos exemplos remoto e de player dentro do repositório github de exemplos de Comunicação Remota Holográfica. Remova a marca de #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE comentário dentro dos arquivos OpenXrProgramm.cpp e SamplePlayerMain.h para habilitar o código de exemplo.

Criar um canal de dados personalizado

Um canal de dados personalizado é definido pelo XrRemotingDataChannelMSFT identificador:

XrRemotingDataChannelMSFT m_userDataChannel;

Depois que uma conexão for estabelecida com êxito, novos canais de dados poderão ser criados por meio 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));

Canais de dados personalizados podem ser criados a partir do player e do aplicativo remoto, mesmo que os runtimes sejam diferentes. Se um canal de dados for criado pelo lado do jogador, 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 a chamada xrCreateRemotingDataChannelMSFT é XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT. Depois que o canal de dados tiver sido totalmente estabelecido, o estado do canal mudará 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 alterna 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 usada 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 será usada para enviar dados para o lado do jogador:

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

Observação

Os dados enviados por um canal de dados personalizado compartilham a largura de banda com outros canais de dados que a Comunicação Remota Holográfica usa.

Recuperar Dados

Sempre que os dados chegam por meio de um canal de dados, uma XrEventDataRemotingDataChannelDataReceivedMSFT estrutura de eventos é colocada na fila de eventos. Os pacotes recebidos podem ser recuperados 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

Você 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 o identificador do canal de dados não deve ser usado 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 alterna para XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT. Para um canal de dados fechado, o XrRemotingDataChannelMSFT identificador permanece válido.

Consulte Também