Anpassade datakanaler med Holographic Remoting och OpenXR API
Använd anpassade datakanaler för att skicka anpassade data via en etablerad fjärrkommunikationsanslutning.
Viktigt
Anpassade datakanaler kräver en anpassad fjärrapp och en anpassad spelarapp. Detta möjliggör kommunikation mellan de två anpassade apparna.
Tips
Ett enkelt ping-pong-exempel finns i fjärr- och spelarexemplen i GitHub-lagringsplatsen Holographic Remoting Samples.
Ta bort kommentar #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE
i OpenXrProgramm.cpp- och SamplePlayerMain.h-filerna för att aktivera exempelkoden.
Anteckning
Den detaljerade specifikationen finns på github-lagringsplatsen Holographic Remoting Samples.
Skapa en anpassad datakanal
En anpassad datakanal definieras av referensen XrRemotingDataChannelMSFT
:
XrRemotingDataChannelMSFT m_userDataChannel;
När en anslutning har upprättats kan nya datakanaler skapas via xrCreateRemotingDataChannelMSFT
funktionen :
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));
Anpassade datakanaler kan skapas från spelaren och fjärrprogrammet även om körningsmiljöerna skiljer sig åt.
Om en datakanal skapas av spelarsidan meddelas fjärrsidan med XrEventDataRemotingDataChannelCreatedMSFT
händelsestrukturen:
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;
}
}
}
Det första XrRemotingDataChannelStatusMSFT
tillståndet efter anropet xrCreateRemotingDataChannelMSFT
är XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT
.
När datakanalen har upprättats helt växlar kanalens tillstånd till XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT
.
Händelsestrukturen XrEventDataRemotingDataChannelOpenedMSFT
placeras i händelsekön när tillståndet för en tidigare skapad datakanal växlar från XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT
till XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT
.
Hämta kanaltillståndet
Funktionen xrGetRemotingDataChannelStateMSFT
kan användas för att fråga datakanaltillståndet:
XrRemotingDataChannelStateMSFT channelState{static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_STATE_MSFT)};
CHECK_XRCMD(m_extensions.xrGetRemotingDataChannelStateMSFT(m_userDataChannel, &channelState));
Skicka data
Om kanalen är öppen xrSendRemotingDataMSFT
används funktionen för att skicka data till spelarsidan:
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));
}
Anteckning
De data som du skickar via en anpassad datakanal delar bandbredden med andra datakanaler som Holographic Remoting använder.
Hämta data
Varje gång data tas emot via en datakanal placeras en XrEventDataRemotingDataChannelDataReceivedMSFT
händelsestruktur i händelsekön.
Mottagna paket kan hämtas med funktionen xrRetrieveRemotingDataMSFT
:
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;
}
}
}
Förstöra en datakanal
Du kan förstöra en datakanal med xrDestroyRemotingDataChannelMSFT
:
CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));
Handtaget XrRemotingDataChannelMSFT
är ogiltigt efter anropet xrDestroyRemotingDataChannelMSFT
och datakanalreferensen får inte användas efteråt.
XrEventDataRemotingDataChannelClosedMSFT
placeras i händelsekön om spelarsidan stänger eller förstör datakanalen.
Datakanalens tillstånd växlar till XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT
.
För en stängd datakanal XrRemotingDataChannelMSFT
förblir handtaget giltigt.