Holographic Remoting ve OpenXR API ile Özel Veri Kanalları
Yerleşik uzaktan iletişim bağlantısı üzerinden özel veri göndermek için özel veri kanallarını kullanın.
Önemli
Özel veri kanalları için özel bir uzak uygulama ve özel bir oynatıcı uygulaması gerekir. Bu, iki özel uygulama arasında iletişime olanak tanır.
İpucu
Holographic Remoting örnekleri github deposunun içindeki uzak ve oyuncu örneklerinde basit bir ping-pong örneği bulunabilir.
Örnek kodu etkinleştirmek için OpenXrProgramm.cpp ve SamplePlayerMain.h dosyalarının içindeki açıklamayı #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE
kaldırın.
Not
Ayrıntılı belirtimHolographic Remoting örnekleri github deposunda bulunabilir.
Özel Veri Kanalı Oluşturma
Tanıtıcı tarafından XrRemotingDataChannelMSFT
özel bir veri kanalı tanımlanır:
XrRemotingDataChannelMSFT m_userDataChannel;
Bağlantı başarıyla kurulduktan sonra işlev aracılığıyla xrCreateRemotingDataChannelMSFT
yeni veri kanalları oluşturulabilir:
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));
Çalışma zamanları farklı olsa bile oynatıcıdan ve uzak uygulamadan özel veri kanalları oluşturulabilir.
Oyuncu tarafı tarafından bir veri kanalı oluşturulursa, uzak tarafa olay yapısıyla bildirim XrEventDataRemotingDataChannelCreatedMSFT
gönderilir:
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;
}
}
}
Çağrıdan sonraki ilk XrRemotingDataChannelStatusMSFT
durum şeklindedirXR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT
.xrCreateRemotingDataChannelMSFT
Veri kanalı tam olarak oluşturulduktan sonra kanalın durumu olarak XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT
değişir.
Olay XrEventDataRemotingDataChannelOpenedMSFT
yapısı, önceden oluşturulmuş bir veri kanalının durumu 'den'e XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT
geçtiğinde olay kuyruğuna XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT
yerleştirilir.
Kanal Durumunu Alma
xrGetRemotingDataChannelStateMSFT
işlevi, veri kanalı durumunu sorgulamak için kullanılabilir:
XrRemotingDataChannelStateMSFT channelState{static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_STATE_MSFT)};
CHECK_XRCMD(m_extensions.xrGetRemotingDataChannelStateMSFT(m_userDataChannel, &channelState));
Veri Gönder
Kanal açıksa xrSendRemotingDataMSFT
, oyuncu tarafına veri göndermek için işlev kullanılır:
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));
}
Not
Özel bir veri kanalı üzerinden gönderdiğiniz veriler, bant genişliğini Holographic Remoting'in kullandığı diğer veri kanallarıyla paylaşır.
Veri Alma
Veriler bir veri kanalı üzerinden her ulaştığında, olay kuyruğuna bir XrEventDataRemotingDataChannelDataReceivedMSFT
olay yapısı yerleştirilir.
Alınan paketler şu işlevle xrRetrieveRemotingDataMSFT
alınabilir:
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;
}
}
}
Veri Kanalını Yok Etme
ile xrDestroyRemotingDataChannelMSFT
bir veri kanalını yok edebilirsiniz:
CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));
XrRemotingDataChannelMSFT
Çağrıdan xrDestroyRemotingDataChannelMSFT
sonra tanıtıcı geçersizdir ve veri kanalı tanıtıcısı daha sonra kullanılmamalıdır.
, XrEventDataRemotingDataChannelClosedMSFT
oynatıcı tarafının veri kanalını kapatması veya yok etme olasılığına karşı olay kuyruğuna yerleştirilir.
Veri kanalı durumu olarak XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT
değişir.
Kapalı bir veri kanalı için XrRemotingDataChannelMSFT
tanıtıcı geçerli kalır.