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.
Nota
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 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.