Canales de datos personalizados con comunicación remota holográfica y la API de OpenXR

Use canales de datos personalizados para enviar datos personalizados a través de una conexión remota establecida.

Importante

Los canales de datos personalizados requieren una aplicación remota personalizada y una aplicación de reproductor personalizada. Esto permite la comunicación entre las dos aplicaciones personalizadas.

Sugerencia

Puede encontrar un ejemplo sencillo de ping-pong en los ejemplos remotos y del reproductor dentro del repositorio de github de ejemplos de comunicación remota holográfica. Quite la marca de comentario #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE dentro de los archivos OpenXrProgramm.cpp y SamplePlayerMain.h para habilitar el código de ejemplo.

Crear un canal de datos personalizado

El identificador define XrRemotingDataChannelMSFT un canal de datos personalizado:

XrRemotingDataChannelMSFT m_userDataChannel;

Una vez establecida correctamente una conexión, se pueden crear nuevos canales de datos a través de la xrCreateRemotingDataChannelMSFT función :

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

Los canales de datos personalizados se pueden crear desde el reproductor y la aplicación remota, incluso si los entornos de ejecución son diferentes. Si el lado del reproductor crea un canal de datos, se notifica al lado remoto con la estructura de XrEventDataRemotingDataChannelCreatedMSFT eventos:

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

El estado inicial XrRemotingDataChannelStatusMSFT después de llamar a xrCreateRemotingDataChannelMSFT es XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT. Una vez que el canal de datos se ha establecido por completo, el estado del canal cambia a XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT. La XrEventDataRemotingDataChannelOpenedMSFT estructura de eventos se coloca en la cola de eventos cuando el estado de un canal de datos creado anteriormente cambia de XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT a XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT.

Obtener el estado del canal

La xrGetRemotingDataChannelStateMSFT función se puede usar para consultar el estado del canal de datos:

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

Enviar datos

Si el canal está abierto, la xrSendRemotingDataMSFT función se usa para enviar datos al lado del reproductor:

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

Los datos que envíe a través de un canal de datos personalizado comparten el ancho de banda con otros canales de datos que usa La comunicación remota holográfica.

Recuperar datos

Cada vez que llegan datos a través de un canal de datos, se coloca una XrEventDataRemotingDataChannelDataReceivedMSFT estructura de eventos en la cola de eventos. Los paquetes recibidos se pueden recuperar con la xrRetrieveRemotingDataMSFT función :

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 un canal de datos

Puede destruir un canal de datos con xrDestroyRemotingDataChannelMSFT:

CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));

El XrRemotingDataChannelMSFT identificador no es válido después de la xrDestroyRemotingDataChannelMSFT llamada y el identificador del canal de datos no se debe usar después.

Se XrEventDataRemotingDataChannelClosedMSFT colocará en la cola de eventos en caso de que el lado del jugador se cierre o destruya el canal de datos. El estado del canal de datos cambia a XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT. Para un canal de datos cerrado, el XrRemotingDataChannelMSFT identificador sigue siendo válido.

Consulte también