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.
Observação
A especificação detalhada pode ser encontrada no repositório github de exemplos de Comunicação Remota Holográfica.
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.