다음을 통해 공유


멀티 플레이어 세션 디렉터리 개요

이 항목에서는 MPSD(멀티 플레이어 세션 디렉터리) 서비스를 통해 타이틀이 사용자 그룹을 연결하는 데 필요한 기본 정보를 공유하는 방법을 설명합니다.

MPSD는 초대를 보내고 수락할 때와 사용자가 게이머 카드를 통해 참가할 때 셸 및 콘솔 운영 체제를 조정합니다.

MPSD는 여러 클라이언트에 걸친 게임의 멀티 플레이어 시스템 메타데이터를 중앙화합니다. MPSD는 세션 기능이 동기화되고 일관적인지 확인합니다.

MPSD는 Xbox 서비스 클라우드에서 작동하는 서비스입니다. 이는 XblMultiplayer 함수로 래핑됩니다.

이 항목에서는 다음에 대해 설명합니다.

MPSD 세션

MPSD 세션은 XblMultiplayerSessionHandle에 의해 식별되며, 한 명 이상의 사용자가 게임을 플레이하는 시나리오를 나타냅니다. 세션은 MPSD에서 Xbox 서비스 클라우드의 보안 JSON 문서로 저장됩니다.

특히 MPSD 세션에는 다음과 같은 특성이 있습니다.

  • 타이틀에 의해 생성 및 관리됩니다.
  • 고유한 URI가 있습니다. 자세한 내용은 세션 디렉터리 URI를 참조하세요.
  • 세션 멤버라 하는 사용자 간 연결을 활성화합니다.
  • 게임 플레이를 가능하게 하는 데이터를 저장합니다(예: 멤버당 특성, 게임 설정, 부트스트래핑 정보 및 게임 서버 정보).

모든 세션에는 플레이어의 Xbox 사용자 식별자(XUID) 및 보안 장치 연결 주소 데이터가 포함되어 있습니다.

MPSD는 다음과 같은 변형을 포함하여 다양한 종류의 멀티 플레이어 게임을 설정하기 위한 여러 종류의 세션을 지원합니다.

세션 변형 설명
게임 세션 게임 플레이 패턴입니다. 게임 세션은 피어 투 피어, 피어 투 호스트, 피어 투 서버 또는 이러한 유형의 하이브리드가 될 수 있습니다.
티켓 세션 매치 메이킹 중에 매치 상태를 추적하는 데 사용되는 도우미 세션입니다. 주로 로비 세션이기도 하고, 게임 세션이 될 수도 있습니다. 자세한 내용은 매치 메이킹 개요를 참조하세요.
대상 세션 매치 메이킹 중에 매치된 게임 플레이를 나타내기 위해 만들어진 도우미 세션입니다. 대부분 항상 게임 세션이기도 합니다. 자세한 내용은 매치 메이킹 개요를 참조하세요.
로비 세션 초대를 받아 게임 세션 참가 대기 중인 플레이어를 수용하는 데 사용되는 도우미 세션입니다. 여러 타이틀에서 로비 세션과 게임 세션을 모두 만듭니다.

이 항목의 맨 위쪽으로 돌아갑니다.

MPSD 변경 알림 처리 및 연결 해제 감지

클라이언트는 RTA(실시간 활동) 서비스 웹 소켓을 사용하여 MPSD에 연결합니다.

연결은 다음을 수행하는 데 사용됩니다.

  • 타이틀에서 개시한 이벤트 구독을 기반으로 세션 변경 시 간단한 알림(숄더 탭) 전송.
  • 사용자 연결 해제 감지.
  • 연결 해제 감지를 기반으로 사용자를 비활성 상태로 설정하고 후속 조치로 세션에서 제거합니다.

사용자 연결 만들기

XSAPI(Xbox 서비스 API) 라이브러리는 클라이언트와 MPSD 간의 연결을 관리합니다.

  1. 타이틀은 XblMultiplayerSetSubscriptionsEnabled를 호출합니다. 이 메서드는 클라이언트가 멀티 플레이어 목적으로 RTA 연결을 사용하려고 한다는 사실을 XSAPI에 알립니다.

  2. 타이틀이 현재 사용자를 활성 상태로 설정하여 XblMultiplayerWriteSessionAsync 또는 XblMultiplayerWriteSessionByHandleAsync를 처음 호출하면 연결이 만들어지고 MPSD에 연결됩니다.

참고 항목

세션 알림을 사용하도록 설정하고 연결 끊김을 감지하려면 세션 템플릿에서 connectionRequiredForActiveMembers을(를) true(으)로 설정해야 합니다.

세션 변경 구독

MPSD는 관심 항목 중 무언가가 변경되었을 때 숄더 탭을 가벼운 알림으로 사용합니다. 구독을 사용하도록 설정한 경우 타이틀은 XblMultiplayerSessionSetSessionChangeSubscription을 호출하여 세션 변경에 대한 숄더 탭을 구독할 수 있습니다.

자세한 내용은 멀티플레이어 작업 항목의 MPSD 세션 변경 알림 구독 섹션을 참조하세요.

숄더 탭 처리

세션 변경 내용이 해당 세션에 대한 타이틀 구독과 일치할 경우 MPSD는 XblMultiplayerSessionChangedHandler 처리기를 사용하여 변경 내용을 타이틀에 알립니다. 타이틀에서 세션을 가져와 가져온 버전과 이전 캐싱된 보기를 비교한 다음 적절한 조치를 취해야 합니다.

연결 상태 변경 알림 처리

타이틀에서 MPSD 연결 상태 변경 사항에 관한 알림을 받을 수 있습니다.

다음과 같은 두 가지 이벤트가 이러한 변경을 신호로 알립니다.

  • XblMultiplayerSessionSubscriptionLostHandler 처리기—RTA 서비스를 사용한 타이틀의 MPSD 연결이 손실된 경우에 실행됩니다. 이 이벤트가 발생하면 타이틀이 멀티 플레이를 종료해야 합니다.
  • XblRealTimeActivityConnectionStateChangeHandler 처리기—RTA 서비스에 대한 타이틀 연결 상태가 일시적으로 변경되면 발생합니다. 타이틀에서 이 이벤트를 수신하는 데 있어 어떠한 조치도 취할 필요가 없습니다. 하지만 이 이벤트는 진단 목적으로 유용할 수 있습니다.

클라이언트 연결 해제

타이틀이 XblMultiplayerSetSubscriptionsEnabled를 호출하여 알림을 사용하지 않도록 설정하면 타이틀의 클라이언트와 MPSD의 연결이 끊어집니다. 이 호출 직후에 XblMultiplayerSessionSubscriptionLostHandler 처리기가 발생하여 클라이언트와 MPSD의 연결이 끊어졌음을 나타냅니다.

참고

이전 멀티 플레이어 버전에서는 타이틀이 XblRealTimeActivityDeactivate을(를) 호출하여 RTA 서비스와의 연결을 해제합니다. 2015 멀티 플레이어 서비스의 경우 이 메서드는 아무런 영향을 주지 않습니다. 연결 해제는 XblMultiplayerSetSubscriptionsEnabledfalse 값으로 호출되고 현재 존재 서비스에 대한 RTA 서비스 구독과 같은 웹 소켓 연결의 사용자가 없는 경우 자동으로 발생합니다.

연결 해제 감지

MPSD는 연결 해제 감지 기능을 사용하여 빠르게 사용자가 즉시 연결 해제된 시점을 확인합니다. 비정상적인 연결 해제의 원인은 플레이어의 네트워크 오류가 발생하거나 또는 타이틀이 충돌하는 경우를 포함합니다.

MPSD에서 연결 해제된 플레이어의 상태를 활성에서 비활성으로 변경하고, 다른 세션 멤버에게 멤버의 세션 구독을 기반으로 변경 사항을 적절하게 알립니다.

RTA 재연결 처리

XSAPI는 연결 해제 시 RTA에 다시 연결하고 RTA 구독을 다시 제출하려고 시도합니다. (자세한 내용은 RTA 서비스에 대한 모범 사례 참조) 멀티플레이어 RTA 구독을 다시 제출하면 클라이언트 RTA 연결에 MPSD 세션의 사용자를 연결하는 데 사용되는 연결 ID가 업데이트됩니다.

XSAPI는 XblMultiplayerAddConnectionIdChangedHandler를 통해 MPSD 연결 ID가 변경되었음을 타이틀에 알립니다. 콜백 내부에서 타이틀은 새 연결 ID를 MPSD 세션에 기록해야 합니다. XblMultiplayerSessionCurrentUserSetStatus 호출한 다음, XblMultiplayerWriteSessionAsync를 호출하여 세션에 기록하면 새 연결 ID를 세션에 기록할 수 있습니다.

void* context{ nullptr };
XblFunctionContext connectionIdChangedFunctionContext = XblMultiplayerAddConnectionIdChangedHandler(
    xblContextHandle,
    [](void* context) {
        XblMultiplayerSessionHandle sessionHandle; // Retrieve the MPSD session to update
        XblMultiplayerSessionCurrentUserSetStatus(sessionHandle, XblMultiplayerSessionMemberStatus::Active);

        auto asyncBlock = std::make_unique<XAsyncBlock>();
        asyncBlock->queue = queue;
        asyncBlock->context = nullptr;
        asyncBlock->callback = [](XAsyncBlock* asyncBlock)
        {
            std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock };

            XblMultiplayerSessionHandle sessionHandle;
            HRESULT hr = XblMultiplayerWriteSessionResult(asyncBlock, &sessionHandle);
            if (SUCCEEDED(hr))
            {
                // If the write call succeeds, the connection ID has been updated and no further action is needed.
            }
            else
            {
                // If the write call fails, it's likely that the user has been removed from the session.
            }
        };

        auto hr = XblMultiplayerWriteSessionAsync(xblContextHandle, sessionHandle, XblMultiplayerSessionWriteMode::UpdateExisting, asyncBlock.get());
        if (SUCCEEDED(hr))
        {
            asyncBlock.release();
        }
    }, 
    context);

이 항목의 맨 위쪽으로 돌아갑니다.

세션에 대한 MPSD 핸들

MPSD 세션 핸들은 추가로 입력된 데이터가 포함될 수 있는 세션에 대한 추상적이고 변경 불가능한 참조입니다. 파일 핸들과 유사합니다. 모든 핸들에는 핸들 ID(GUID)와 서비스 ID(SCID), 세션 템플릿 및 세션 이름이 포함된 전체 세션 참조가 있습니다. 핸들은 업데이트될 수 없지만 생성, 읽기 및 삭제는 가능합니다.

참고 항목

핸들은 존재하지 않는 세션을 가리킬 수 있습니다. 존재하지 않는 세션 이름을 사용하여 핸들을 생성하면 새 세션이 생성되지 않습니다.

핸들 유형

2015 멀티 플레이어는 초대 핸들 및 활동 핸들을 지원합니다.

초대 핸들

초대 핸들은 특정 사용자에 대한 초대를 나타냅니다. 유형별 데이터에는 소스 사용자, 대상 사용자 및 초대를 설명하는 컨텍스트 문자열(예: 특정 게임 모드)이 포함됩니다.

초대 핸들은 열린 세션에 대한 읽기-쓰기 액세스 권한을 부여합니다. 세션이 닫힌 경우 핸들은 읽기 전용 세션 액세스 권한을 부여합니다.

참고 항목

세션이 꽉 찼거나 닫혀 있는 경우에도 MPSD는 초대를 만들 수 있습니다.

초대 핸들 만들기

초대 핸들을 만들기 위해 타이틀은 XblMultiplayerSendInvitesAsync를 호출합니다. 메서드에서 알림으로 특정 사용자에게 초대를 보내고, 수신자는 초대에 수락할 수 있습니다.

활동 핸들 만들기

활동 핸들을 만들기 위해 타이틀은 XblMultiplayerSetActivityAsync를 호출합니다. MPSD는 새 핸들 ID를 세션 멤버의 바인딩된 활동으로 설정합니다.

이전에 바인딩된 활동이 있는 경우 MPSD에서 해당 핸들을 삭제합니다. 활성 멤버가 비활성 상태가 되거나 세션을 나가는 경우 MPSD에서 바인딩된 활동 핸들을 삭제합니다.

핸들 사용

사용자가 초대를 수락하는 경우(초대 핸들)와 사용자가 친구의 현재 활동에 참가하는 경우(활동 핸들) 타이틀에서 핸들을 사용합니다.

두 경우 모두 타이틀은 다음 작업을 수행해야 합니다.

  1. 타이틀 활성화 매개 변수에서 핸들 ID를 가져옵니다.
  2. 로컬 MPSD 세션 개체를 만들고 이를 활성 상태로 참가시킵니다.
  3. 세션을 쓰고, 적절한 핸들에서 전달합니다.

이 항목의 맨 위쪽으로 돌아갑니다.

세션 업데이트의 동기화

세션은 모든 멤버가 생성 또는 업데이트할 수 있는 공유 리소스입니다. 따라서 쓰기 충돌이 발생할 수 있습니다. 이로 인해 예기치 않은 결과가 발생할 수 있습니다. 예를 들어 한 타이틀에서 다른 타이틀에서 이루어진 변경 사항을 덮어쓸 수 있습니다. 이러한 충돌을 해결하는 MPSD의 접근 방식은 낙관적 동시성과 읽기-수정-쓰기 패턴을 지원하는 것입니다.

MPSD의 세션 업데이트 동기화는 2개의 상위 수준 구현 패턴을 사용합니다.

  • 중재자가 세션의 공유 부분을 업데이트합니다. 구현에 단일 중재자가 포함된 경우 대부분 쓰기 작업에 대해 동기식 업데이트 사용을 방지할 수 있습니다. 타이틀은 다음과 같은 경우에 동기화를 방지할 수 있습니다.

    • 중재자의 ID 전달과 관련이 없는 한, 중재자가 세션의 공유 부분에 대해 수행하는 모든 업데이트
    • 타이틀이 세션 내의 멤버 영역에 대해 수행하는 모든 업데이트

    참고 항목

    앞서 언급한 업데이트 유형에는 동기화가 필요하지 않지만 XblMultiplayerSessionProperties::HostDeviceToken 속성에 대한 업데이트를 동기화하는 것도 중요합니다. 해당 속성은 중재자의 ID를 중재자 마이그레이션의 일부로 전달하는 데 사용됩니다.

  • 모든 클라이언트는 세션의 공유 부분을 업데이트합니다. 이 경우 세션의 공유 부분에 대한 모든 업데이트가 동기화되어야 합니다. 그러나 타이틀은 동기화 없이 자신의 멤버 영역에 계속 쓸 수 있습니다.

멀티플레이어 API를 사용한 세션 동기화 업데이트

다음 멀티플레이어 API 메서드는 낙관적 동시성을 구현합니다.

각 쓰기 메서드는 XblMultiplayerSessionWriteMode 값을 수락합니다. SynchronizedUpdate 값을 전달하면 업데이트에 낙관적 동시성이 사용됩니다.

열거형의 다른 값은 세션 최초 생성 시 잠재적 충돌 해결에 도움이 됩니다. 다른 타이틀에서 잠재적으로 쓸 수 있는 MPSD 세션의 부분에 대한 모든 쓰기는 동기식 업데이트를 사용해야 합니다. 그러나 모든 쓰기를 보호해야 하는 것은 아닙니다.

타이틀이 쓰기 세션 메서드 중 하나를 사용하여 로컬 세션 개체를 MPSD에 쓰려고 시도하면 HTTP/412 상태 코드를 받을 수 있습니다. 이 경우 쓰기를 다시 시도하기 전에 XblMultiplayerGetSessionAsync 호출을 실행하여 세션의 최신 서버 버전을 가져와 로컬 복사본을 새로 고쳐야 합니다. 그러지 않으면 로컬 세션 문서에 잘못된 데이터가 계속 포함되고, 세션 쓰기 호출은 계속 실패합니다.

참고

타이틀이 쓰기 세션 메서드 중 하나를 호출하면 세션의 업데이트된 버전이 반환될 수 있습니다. 세션의 업데이트된 버전이 반환된 경우 타이틀에서 로컬 캐싱된 복사본을 스레드 안전 방식을 통해 새 버전으로 대체해야 합니다.

멀티플레이어 REST API를 사용한 세션 동기화 업데이트

MPSD는 HTTP "if-match" 헤더와 ETag 설정 및 읽기-수정-쓰기 패턴을 사용한 REST 기능을 통해 세션 업데이트의 낙관적 동시성을 지원합니다. 쓰기 요청에 전달된 ETag는 MPSD에서 이전 읽기 요청에서 반환한 것이어야 합니다.

이 항목의 맨 위쪽으로 돌아갑니다.

MPSD 호출

타이틀은 멀티 플레이어 시스템 및 매치 메이킹 사용을 위해 다음과 같은 방법으로 MPSD에 액세스할 수 있습니다.

  • RESTful 기능에 대한 래퍼 역할을 하는 클래스가 포함된 멀티 플레이어 API를 사용하는 것이 좋습니다. 자세한 내용은 XblMultiplayer 접두사 함수를 참조하세요. SmartMatch 매치 메이킹의 경우 XblMatchmaking 접두사 함수로 나타내는 매치 메이킹 API를 사용합니다.
  • Xbox 서비스 RESTful 참조에 포함된 멀티 플레이어 및 매치 메이킹 REST AP에 대한 직접 표준 HTTP 호출을 사용합니다. 해당 URI는 세션 디렉터리 URI(멀티 플레이어) 및 매치 메이킹 URI(매치 메이킹) 섹션에서 설명합니다. 관련된 JSON 개체는 JSON(JavaScript 개체 표기법) 개체 참조 섹션에 설명되어 있습니다.

멀티 플레이어 API를 사용하여 MPSD 호출

XSAPI에서 멀티 플레이어 및 매치 메이킹 API를 사용하여 MPSD를 호출하는 것이 좋습니다.

참고 항목

이 샘플은 멀티 플레이어 및 매치 메이킹 API와 XSAPI의 다른 요소를 사용하여 작성되었습니다.

기본 REST 기능에 대한 래퍼 코드 사용을 통해 각 호출에 대한 HTTP 트래픽을 처리할 필요 없이 클라이언트 측 API 메서드를 사용하는 데 있어 더욱 일반적인 접근 방식이 가능합니다.

멀티플레이어어 REST API를 사용하여 MPSD 조작

타이틀 또는 그 서비스에서는 멀티 플레이어 REST API 및 매치 메이킹 REST API에 대해 표준 HTTP 호출을 사용할 수 있습니다. REST 기능을 직접 사용할 때 호출자는 대부분 작업에 대한 세션 디렉터리 URI에 대해 DELETE, PUT, POSTGET 호출을 발행합니다. PUT 요청에서 요청 본문은 기존 세션에 병합됩니다.

기존 세션이 없는 경우 요청 본문은 파트너 센터에 저장된 세션 템플릿과 함께 새 세션을 만드는 데 사용됩니다.

모든 필드는 선택 사항이며, 델타만 지정되어야 합니다. 따라서 {}은(는) 델타가 0인 유효한 PUT 요청입니다.

서버의 공식 세션 복사본에 영향을 미치지 않고 병합 결과를 반환하는 가상 PUT 요청을 수행하려면 쿼리 문자열 ?nocommit=true을(를) PUT 요청에 추가할 수 있습니다.

멀티 플레이어 및 매치 메이킹 REST API 메서드에 대한 요청 및 응답은 JSON 문서입니다. 멀티 플레이어 세션 요청 구조의 경우 MultiplayerSessionRequest(JSON)를 참조하세요.

관련 응답 구조는 MultiplayerSession(JSON)에 있습니다. 응답 구조는 세션 멤버를 연결된 목록으로 구성하고, 세션 및 세션 멤버의 읽기 전용 속성을 채웁니다.

세션 및 세션 템플릿 쿼리(REST)

타이틀에서 서비스 구성 및 세션 템플릿 수준에서 세션 정보를 쿼리할 수 있습니다. 이 섹션에서는 멀티 플레이어 REST API를 사용하는 쿼리를 설명합니다.

기본 세션 정보 쿼리

세션 디렉터리 및 매치 메이킹 URI를 사용하여 기본 세션 정보에 대한 쿼리를 설정할 수 있습니다. 쿼리의 결과는 세션 참조의 JSON 배열이며 일부 세션 데이터는 인라인에 포함됩니다. 기본적으로 쿼리는 최대 100개의 비공개가 아닌 세션을 가져옵니다.

참고 항목

모든 쿼리에는 키워드 필터, XUID 필더 또는 두 가지 모두 포함되어야 합니다.

세션 템플릿 쿼리

특정 세션 템플릿의 세부 정보는 물론 SCID에 대한 세션 템플릿 목록을 가져오려면 다음 URI에 대해 GET 메서드를 사용합니다.

  • /serviceconfigs/{scid}/sessiontemplates
  • /serviceconfigs/{scid}/sessiontemplates/{sessionTemplateName}

세션 상태 쿼리

세션 상태를 쿼리하려면 다음 URI 중 하나에 대해 GET 메서드를 사용합니다.

  • /serviceconfigs/{scid}/sessions
  • /serviceconfigs/{scid}/sessiontemplates/{sessionTemplateName}/sessions

이 항목의 맨 위쪽으로 돌아갑니다.

멀티 플레이어 세션 탐색기

멀티 플레이어 세션 탐색기는 세션, 세션 템플릿 및 현지화 문자열 검색용으로 MPSD에 빌드된 도구입니다. 이 도구는 개발자 샌드박스에만 사용해야 합니다.

멀티 플레이어 세션 탐색기 액세스

참고 항목

도구를 사용하려면 로그인해야 합니다. 로그인한 사용자가 멤버인 세션으로 검색이 제한됩니다.

멀티 플레이어 세션 탐색기에 액세스하려면 Xbox One(이상) 콘솔에서 브라우저를 열고 보기 단추를 누른 다음, 주소 상자에 https://sessiondirectory.xboxlive.com/debug(을)를 입력합니다.

참고 항목

RETAIL 샌드박스에 있는 도구에 액세스하고자 하는 경우 HTTP/404 상태 코드를 받게 됩니다. 이 코드에 대한 자세한 내용은 멀티 플레이어 세션 상태 코드를 참조하세요.

메인 페이지 열기

  1. 도구의 메인 페이지를 엽니다. 보안 컨텍스트(로그인한 사용자 및 샌드박스)와 샌드박스의 SCID 목록이 표시됩니다.

  2. 메뉴 버튼을 눌러 이 페이지를 홈에 고정하면 URI를 다시 입력할 필요가 없습니다.

사용 가능한 세션 및 템플릿 표시

  1. 도구에서 SCID를 선택하여 로그인한 사용자가 멤버로 포함된 SCID의 세션 목록을 표시합니다.

  2. 동일한 페이지에서 SCID를 선택하고 해당 SCID에 대한 서비스 구성에 있는 세션 템플릿 및 현지화 문자열을 표시할 수 있습니다. 이러한 항목은 파트너 센터를 통해 수집됩니다.

세션의 전체 콘텐츠 표시

멀티 플레이어 세션 탐색기에서 세션 이름을 선택하면 해당 세션의 전체 콘텐츠가 표시됩니다.

MPSD에 의해 표시된 세션은 다음과 같은 이유로 인해 세션의 URI에 대한 표준 GET 메서드의 응답과 다를 수 있습니다.

  • GET 호출에서 X-Xbl-Contract-Version 헤더에 있는 이전 계약 버전을 사용할 수 있습니다. 멀티 플레이어 세션 탐색기는 항상 최신 계약 버전을 사용하여 세션을 표시합니다.

  • GET을(를) 통해 일반적으로 세션이 요청되는 경우 변형과 부작용이 트리거될 수 있습니다(예: 제한 시간 만료). 멀티 플레이어 세션 탐색기는 어떠한 논리, 변형 또는 부작용을 실행하지 않고 저장된 것과 같이 세션의 스냅샷을 표시합니다.

  • nextTimer JSON 개체 필드가 부작용으로 동시에 계산되므로 MPSD 세션에 표시되지 않습니다.

이 항목의 맨 위쪽으로 돌아갑니다.

참고 항목

이 항목의 맨 위쪽으로 돌아갑니다.