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.
Nota
La especificación detallada se puede encontrar en el repositorio de github de ejemplos de comunicación remota holográfica.
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.