홀로그램 원격 및 OpenXR API를 사용하는 사용자 지정 데이터 채널

사용자 지정 데이터 채널을 사용하여 설정된 원격 연결을 통해 사용자 지정 데이터를 보냅니다.

중요

사용자 지정 데이터 채널에는 사용자 지정 원격 앱과 사용자 지정 플레이어 앱이 필요합니다. 이렇게 하면 두 사용자 지정 앱 간의 통신이 가능합니다.

간단한 ping-pong 예제는 홀로그램 원격 샘플 github 리포지토리 내의 원격 및 플레이어 샘플에서 찾을 수 있습니다. 샘플 코드를 사용하도록 설정하려면 OpenXrProgramm.cpp 및 SamplePlayerMain.h 파일 내에서 주석 #define ENABLE_CUSTOM_DATA_CHANNEL_SAMPLE 처리를 제거합니다.

참고

자세한 사양홀로그램 원격 샘플 github 리포지토리에서 찾을 수 있습니다.

사용자 지정 데이터 채널 만들기

사용자 지정 데이터 채널은 핸들에 의해 정의됩니다.XrRemotingDataChannelMSFT

XrRemotingDataChannelMSFT m_userDataChannel;

연결이 성공적으로 설정되면 함수를 통해 xrCreateRemotingDataChannelMSFT 새 데이터 채널을 만들 수 있습니다.

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));

런타임이 다르더라도 플레이어와 원격 애플리케이션에서 사용자 지정 데이터 채널을 만들 수 있습니다. 플레이어 쪽에서 데이터 채널을 만들면 원격 쪽에 이벤트 구조에 대한 알림이 XrEventDataRemotingDataChannelCreatedMSFT 표시됩니다.

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;
        }
    }
}

호출 xrCreateRemotingDataChannelMSFT 후의 초기 XrRemotingDataChannelStatusMSFT 상태는 입니다XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFT. 데이터 채널이 완전히 설정되면 채널의 상태가 로 XR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT전환됩니다. 이벤트 구조는 XrEventDataRemotingDataChannelOpenedMSFT 이전에 만든 데이터 채널의 상태가 에서 로 전환되면 이벤트 큐에 XR_REMOTING_DATA_CHANNEL_STATUS_OPEN_PENDING_MSFTXR_REMOTING_DATA_CHANNEL_STATUS_OPENED_MSFT배치됩니다.

채널 상태 가져오기

함수를 xrGetRemotingDataChannelStateMSFT 사용하여 데이터 채널 상태를 쿼리할 수 있습니다.

XrRemotingDataChannelStateMSFT channelState{static_cast<XrStructureType>(XR_TYPE_REMOTING_DATA_CHANNEL_STATE_MSFT)};
CHECK_XRCMD(m_extensions.xrGetRemotingDataChannelStateMSFT(m_userDataChannel, &channelState));

데이터 보내기

채널이 열려 xrSendRemotingDataMSFT 있는 경우 함수는 플레이어 쪽에 데이터를 보내는 데 사용됩니다.

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));
}

참고

사용자 지정 데이터 채널을 통해 보내는 데이터는 홀로그램 원격에서 사용하는 다른 데이터 채널과 대역폭을 공유합니다.

데이터 검색

데이터 채널을 XrEventDataRemotingDataChannelDataReceivedMSFT 통해 데이터가 도착할 때마다 이벤트 구조가 이벤트 큐에 배치됩니다. 받은 패킷은 함수를 사용하여 검색할 수 있습니다.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;
        }
    }
}

데이터 채널 삭제

를 사용하여 데이터 채널을 xrDestroyRemotingDataChannelMSFT삭제할 수 있습니다.

CHECK_XRCMD(m_extensions.xrDestroyRemotingDataChannelMSFT(m_userDataChannel));

XrRemotingDataChannelMSFT 호출 후 xrDestroyRemotingDataChannelMSFT 핸들이 잘못되었으며 나중에 데이터 채널 핸들을 사용하면 안 됩니다.

XrEventDataRemotingDataChannelClosedMSFT 는 플레이어 쪽이 데이터 채널을 닫거나 삭제하는 경우 이벤트 큐에 배치됩니다. 데이터 채널 상태는 로 XR_REMOTING_DATA_CHANNEL_STATUS_CLOSED_MSFT전환됩니다. 닫힌 데이터 채널의 경우 핸들은 XrRemotingDataChannelMSFT 유효한 상태로 유지됩니다.

참고 항목