Vlastní datové kanály s Holographic Remotingem a rozhraním OpenXR API
K odesílání vlastních dat přes navázané vzdálené připojení použijte vlastní datové kanály.
Důležité
Vlastní datové kanály vyžadují vlastní vzdálenou aplikaci a vlastní aplikaci přehrávače. To umožňuje komunikaci mezi těmito dvěma vlastními aplikacemi.
Tip
Jednoduchý příklad ping-pong najdete v ukázkách remote a player v úložišti GitHubu s ukázkami Holographic Remoting.
Zrušením komentáři #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE
v souborech OpenXrProgramm.cpp a SamplePlayerMain.h povolte vzorový kód.
Poznámka
Podrobnou specifikaci najdete v úložišti GitHubu s ukázkami holografické komunikace.
Vytvoření vlastního datového kanálu
Vlastní datový kanál je definován popisovačem XrRemotingDataChannelMSFT
:
XrRemotingDataChannelMSFT m_userDataChannel;
Po úspěšném navázání připojení je možné vytvořit nové datové kanály prostřednictvím xrCreateRemotingDataChannelMSFT
funkce :
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));
Vlastní datové kanály je možné vytvořit z přehrávače a vzdálené aplikace i v případě, že se moduly runtime liší.
Pokud je datový kanál vytvořen na straně přehrávače, vzdálená strana je upozorněna strukturou XrEventDataRemotingDataChannelCreatedMSFT
události:
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;
}
}
}
Počáteční XrRemotingDataChannelStatusMSFT
stav po volání xrCreateRemotingDataChannelMSFT
je XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT
.
Po úplném vytvoření datového kanálu se stav kanálu přepne na XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT
.
Struktura XrEventDataRemotingDataChannelOpenedMSFT
událostí se umístí do fronty událostí, když se stav dříve vytvořeného datového kanálu přepne z XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT
na XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT
.
Získání stavu kanálu
Funkci xrGetRemotingDataChannelStateMSFT
je možné použít k dotazování stavu datového kanálu:
XrRemotingDataChannelStateMSFT channelState{static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_STATE_MSFT)};
CHECK_XRCMD(m_extensions.xrGetRemotingDataChannelStateMSFT(m_userDataChannel, &channelState));
Odeslat data
Pokud je kanál otevřený, xrSendRemotingDataMSFT
použije se funkce k odesílání dat na stranu přehrávače:
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));
}
Poznámka
Data odesílaná přes vlastní datový kanál sdílí šířku pásma s jinými datovými kanály, které Holographic Remoting používá.
Načtení dat
Pokaždé, když data přicházejí přes datový kanál, XrEventDataRemotingDataChannelDataReceivedMSFT
se struktura událostí umístí do fronty událostí.
Přijaté pakety je možné načíst pomocí xrRetrieveRemotingDataMSFT
funkce :
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;
}
}
}
Zničení datového kanálu
Datový kanál můžete zničit pomocí xrDestroyRemotingDataChannelMSFT
příkazu :
CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));
Popisovač XrRemotingDataChannelMSFT
je po xrDestroyRemotingDataChannelMSFT
volání neplatný a popisovač datového kanálu nesmí být použit později.
Objekt XrEventDataRemotingDataChannelClosedMSFT
se umístí do fronty událostí pro případ, že by se strana hráče zavřela nebo zničila datový kanál.
Stav datového kanálu se přepne na XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT
.
U uzavřeného datového XrRemotingDataChannelMSFT
kanálu zůstane popisovač platný.