Aangepaste gegevenskanalen met holografische externe communicatie en de OpenXR-API
Gebruik aangepaste gegevenskanalen om aangepaste gegevens te verzenden via een tot stand gebrachte externe verbinding.
Belangrijk
Aangepaste gegevenskanalen vereisen een aangepaste externe app en een aangepaste speler-app. Dit maakt communicatie tussen de twee aangepaste apps mogelijk.
Tip
Een eenvoudig voorbeeld van pingpong is te vinden in de voorbeelden voor externe en spelers in de GitHub-opslagplaats holographic Remoting samples.
Verwijder de opmerking #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE
in de bestanden OpenXrProgramm.cpp en SamplePlayerMain.h om de voorbeeldcode in te schakelen.
Notitie
De gedetailleerde specificatie vindt u in de GitHub-opslagplaats holographic Remoting-voorbeelden.
Een aangepast gegevenskanaal maken
Een aangepast gegevenskanaal wordt gedefinieerd door de XrRemotingDataChannelMSFT
ingang:
XrRemotingDataChannelMSFT m_userDataChannel;
Nadat een verbinding tot stand is gebracht, kunnen nieuwe gegevenskanalen worden gemaakt via de xrCreateRemotingDataChannelMSFT
functie:
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));
Aangepaste gegevenskanalen kunnen worden gemaakt vanuit de speler en de externe toepassing, zelfs als de runtimes verschillen.
Als een gegevenskanaal wordt gemaakt door de spelerzijde, wordt de externe zijde op de hoogte gesteld met de XrEventDataRemotingDataChannelCreatedMSFT
gebeurtenisstructuur:
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;
}
}
}
De beginstatus XrRemotingDataChannelStatusMSFT
na het aanroepen xrCreateRemotingDataChannelMSFT
is XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT
.
Zodra het gegevenskanaal volledig tot stand is gebracht, schakelt de status van het kanaal over naar XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT
.
De XrEventDataRemotingDataChannelOpenedMSFT
gebeurtenisstructuur wordt in de gebeurteniswachtrij geplaatst wanneer de status van een eerder gemaakt gegevenskanaal overschakelt van XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT
naar XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT
.
De kanaalstatus ophalen
De xrGetRemotingDataChannelStateMSFT
functie kan worden gebruikt om een query uit te voeren op de status van het gegevenskanaal:
XrRemotingDataChannelStateMSFT channelState{static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_STATE_MSFT)};
CHECK_XRCMD(m_extensions.xrGetRemotingDataChannelStateMSFT(m_userDataChannel, &channelState));
Gegevens verzenden
Als het kanaal is geopend, wordt de xrSendRemotingDataMSFT
functie gebruikt om gegevens naar de speler te verzenden:
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));
}
Notitie
De gegevens die u via een aangepast gegevenskanaal verzendt, delen de bandbreedte met andere gegevenskanalen die holographic remoting gebruikt.
Gegevens ophalen
Telkens wanneer gegevens binnenkomen via een gegevenskanaal, wordt er een XrEventDataRemotingDataChannelDataReceivedMSFT
gebeurtenisstructuur in de gebeurteniswachtrij geplaatst.
Ontvangen pakketten kunnen worden opgehaald met de xrRetrieveRemotingDataMSFT
functie:
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;
}
}
}
Een gegevenskanaal vernietigen
U kunt een gegevenskanaal vernietigen met xrDestroyRemotingDataChannelMSFT
:
CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));
De XrRemotingDataChannelMSFT
ingang is ongeldig na de xrDestroyRemotingDataChannelMSFT
aanroep en de ingang van het gegevenskanaal mag daarna niet meer worden gebruikt.
De XrEventDataRemotingDataChannelClosedMSFT
wordt in de gebeurteniswachtrij geplaatst voor het geval de speler het gegevenskanaal sluit of vernietigt.
De status van het gegevenskanaal wordt overgeschakeld naar XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT
.
Voor een gesloten gegevenskanaal blijft de XrRemotingDataChannelMSFT
ingang geldig.