Aracılığıyla paylaş


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.

Ö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_MSFTdeğ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_MSFTyerleş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 xrDestroyRemotingDataChannelMSFTbir 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_MSFTdeğişir. Kapalı bir veri kanalı için XrRemotingDataChannelMSFT tanıtıcı geçerli kalır.

Ayrıca Bkz.