XblMultiplayer 함수로 래핑되어 있습니다.
이 항목에서는 다음을 다룹니다.
MPSD 세션
MPSD 세션은XblMultiplayerSessionHandle로 식별되며, 하나 이상의 사용자가 게임을 플레이하는 시나리오를 나타냅니다.
세션은 MPSD가 XBOX services 클라우드에 안전한 JSON 문서로 저장합니다.
구체적으로 MPSD 세션은 다음과 같은 특성을 가집니다.
- 타이틀에 의해 생성되고 관리됩니다.
- 고유한 URI를 가집니다. 자세한 내용은 Session Directory URIs를 참조하세요.
- 세션 구성원이라고 하는 사용자 간의 연결을 가능하게 합니다.
- 구성원별 특성, 게임 설정, 부트스트래핑 정보 및 게임 서버 정보와 같은 게임 플레이를 지원하는 데이터를 저장합니다.
이 항목의 맨 위로 돌아가기.
MPSD 변경 알림 처리 및 연결 해제 감지
클라이언트는 Real-Time Activity(RTA) 서비스 웹 소켓을 사용하여 MPSD에 연결합니다. 연결은 다음 작업에 사용됩니다.- 타이틀이 시작한 이벤트 구독을 기반으로 세션 변경이 발생할 때 간단한 알림(숄더 탭)을 전송합니다.
- 사용자 연결 해제를 감지합니다.
- 연결 해제 감지에 따라 사용자를 비활성으로 설정한 후 세션에서 제거합니다.
사용자 연결 만들기
XBOX Services API(XSAPI) 라이브러리는 클라이언트와 MPSD 간의 연결을 관리합니다.- 타이틀은 XblMultiplayerSetSubscriptionsEnabled를 호출합니다. 이 메서드는 클라이언트가 멀티플레이어 목적으로 RTA 연결을 사용할 것임을 XSAPI에 알립니다.
- 타이틀이 현재 사용자를 활성 상태로 설정한 채 XblMultiplayerWriteSessionAsync 또는 XblMultiplayerWriteSessionByHandleAsync에 대한 첫 번째 호출을 수행하면 연결이 생성되어 MPSD에 연결됩니다.
세션 알림을 활성화하고 연결 해제를 감지하려면 세션 템플릿에서
connectionRequiredForActiveMembers를 true로 설정해야 합니다.세션 변경 구독
MPSD는 관심 있는 것이 변경되었음을 알리는 경량 알림으로 숄더 탭을 사용합니다. 구독이 활성화되면 타이틀은 XblMultiplayerSessionSetSessionChangeSubscription 호출을 통해 세션 변경에 대한 숄더 탭을 구독할 수 있습니다. 자세한 내용은 Multiplayer tasks 항목의 MPSD 세션 변경 알림 구독 섹션을 참조하세요.숄더 탭 처리
세션의 변경이 해당 세션에 대한 타이틀의 구독과 일치하면, MPSD는 XblMultiplayerSessionChangedHandler 핸들러를 사용하여 변경 사항을 타이틀에 알립니다. 타이틀은 세션을 검색한 다음 검색된 세션 버전을 이전에 캐시된 뷰와 비교하고 적절한 조치를 취해야 합니다.연결 상태 변경 알림 처리
타이틀은 MPSD에 대한 연결 상태 변경에 대해 알림을 받을 수 있습니다. 두 가지 이벤트가 이러한 변경을 알립니다.- XblMultiplayerSessionSubscriptionLostHandler 핸들러 - RTA 서비스를 사용하는 MPSD에 대한 타이틀 연결이 손실될 때 발생합니다. 이 이벤트가 발생하면 타이틀은 멀티플레이어를 종료해야 합니다.
- XblRealTimeActivityConnectionStateChangeHandler 핸들러 - RTA 서비스에 대한 타이틀 연결 상태의 일시적 변경 시 발생합니다. 타이틀은 이 이벤트를 수신할 때 어떠한 조치를 취할 필요는 없지만, 이 이벤트는 진단 목적에 유용할 수 있습니다.
클라이언트 연결 해제
타이틀이 XblMultiplayerSetSubscriptionsEnabled 호출로 알림을 비활성화하면 타이틀의 클라이언트는 MPSD에서 연결이 해제됩니다. 이 호출 직후 XblMultiplayerSessionSubscriptionLostHandler 핸들러가 발생하여 클라이언트가 MPSD에서 연결이 해제되었음을 나타냅니다.이전 멀티플레이어 버전에서는 타이틀이 RTA 서비스에서 연결을 해제하기 위해
XblRealTimeActivityDeactivate를 호출했습니다.
2015 Multiplayer 서비스의 경우 이 메서드는 아무런 효과가 없습니다.
XblMultiplayerSetSubscriptionsEnabled가 false 값으로 호출되고, Presence 서비스에 대한 RTA 서비스 구독 등 웹 소켓 연결 사용자가 없을 경우 연결 해제가 자동으로 이루어집니다.연결 해제 감지
MPSD는 연결 해제 감지 기능을 사용하여 사용자가 비정상적으로 연결이 해제되는 경우를 빠르게 찾아냅니다. 비정상적 연결 해제의 원인에는 플레이어의 네트워크 장애나 타이틀 충돌 등이 포함됩니다. MPSD는 연결이 해제된 플레이어의 상태를 활성에서 비활성으로 변경하고, 세션에 대한 구성원의 구독에 따라 적절히 다른 세션 구성원에게 변경 사항을 알립니다.RTA 재연결 처리
XSAPI는 연결 해제 시 RTA에 대한 재연결을 시도하고 RTA 구독을 다시 제출합니다. (자세한 내용은 RTA 서비스 모범 사례를 참조하세요.) 멀티플레이어 RTA 구독을 다시 제출하면 MPSD 세션의 사용자를 클라이언트 RTA 연결과 연결하는 데 사용되는 연결 ID가 업데이트됩니다. XSAPI는 XblMultiplayerAddConnectionIdChangedHandler를 통해 MPSD 연결 ID가 변경되었음을 타이틀에 알립니다. 콜백 내부에서 타이틀은 새 연결 ID를 MPSD 세션에 기록해야 합니다. 새 연결 ID는 XblMultiplayerSessionCurrentUserSetStatus를 호출한 다음 XblMultiplayerWriteSessionAsync를 호출하여 세션에 기록될 수 있습니다.세션에 대한 MPSD 핸들
MPSD 세션 핸들은 세션에 대한 추상적이고 불변인 참조로, 추가로 형식화된 데이터를 포함할 수도 있습니다. 파일 핸들과 유사합니다. 모든 핸들에는 핸들 ID(GUID)와 서비스 구성 ID(SCID), 세션 템플릿 및 세션 이름으로 구성된 전체 세션 참조가 있습니다. 핸들은 업데이트할 수 없지만, 생성, 읽기, 삭제할 수 있습니다.핸들은 존재하지 않는 세션을 가리킬 수 있습니다.
존재하지 않는 세션 이름을 사용하여 핸들을 만들어도 새 세션이 생성되지 않습니다.
핸들 유형
2015 Multiplayer는 초대 핸들 및 활동 핸들을 지원합니다.초대 핸들
초대 핸들은 특정 사용자에 대한 초대(초대장)를 나타냅니다. 형식별 데이터에는 소스 사용자, 대상 사용자 및 초대를 설명하는 컨텍스트 문자열(예: 특정 게임 모드)이 포함됩니다. 초대 핸들은 열린 세션에 대한 읽기-쓰기 액세스 권한을 부여합니다. 세션이 닫혀 있으면 핸들은 세션에 대한 읽기 전용 액세스 권한을 부여합니다.MPSD는 세션이 가득 차 있거나 닫혀 있어도 초대를 만들 수 있습니다.
초대 핸들 만들기
초대 핸들을 만들려면 타이틀이 XblMultiplayerSendInvitesAsync를 호출합니다. 이 메서드는 수신자가 조치를 취하여 초대를 수락할 수 있는 알림으로 지정된 사용자에게 초대를 보냅니다.활동 핸들 만들기
활동 핸들을 만들려면 타이틀이 XblMultiplayerSetActivityAsync를 호출합니다. MPSD는 새 핸들 ID를 세션 구성원의 바인딩된 활동으로 설정합니다. 이전에 바인딩된 활동이 있는 경우, MPSD는 해당 핸들을 삭제합니다. 활성 구성원이 비활성이 되거나 세션을 떠나면 MPSD는 바인딩된 활동 핸들을 삭제합니다.핸들 사용
타이틀은 사용자가 초대를 수락할 때(초대 핸들)와 사용자가 친구의 현재 활동에 참여할 때(활동 핸들) 핸들을 사용합니다. 이 두 경우 모두 타이틀은 다음 조치를 취해야 합니다.- 타이틀 활성화 매개 변수에서 핸들 ID를 가져옵니다.
- 로컬 MPSD 세션 개체를 만든 다음, 활성 상태로 참가합니다.
- 적절한 핸들을 전달하여 세션을 씁니다.
세션 업데이트의 동기화
세션은 구성원 중 누구든지 만들거나 업데이트할 수 있는 공유 리소스입니다. 그 결과 충돌하는 쓰기가 발생할 수 있습니다. 예를 들어 한 타이틀이 다른 타이틀의 변경 사항을 덮어쓸 경우 예상치 못한 결과를 초래할 수 있습니다. 이러한 충돌을 해결하기 위한 MPSD 방식은 낙관적 동시성 및 읽기-수정-쓰기 패턴을 지원하는 것입니다. MPSD의 세션 업데이트 동기화는 두 가지 관련된 상위 수준 구현 패턴을 사용합니다.-
중재자가 세션의 공유 부분을 업데이트합니다. 구현에 단일 중재자가 포함된 경우 대부분의 쓰기 작업에 대해 동기화된 업데이트 사용을 피할 수 있습니다. 타이틀은 다음과 같은 경우에 동기화를 피할 수 있습니다.
- 중재자의 신원 전달과 관련이 없는 한, 중재자가 세션의 공유 부분에 대해 수행하는 모든 업데이트
- 타이틀이 세션 내 구성원 영역에 대해 수행하는 모든 업데이트
[!NOTE] 앞서 언급한 업데이트 유형은 동기화가 필요하지 않지만, XblMultiplayerSessionProperties
::HostDeviceToken속성에 대한 업데이트는 여전히 동기화하는 것이 중요합니다. 이 속성은 예를 들어 중재자 마이그레이션의 일환으로 중재자의 신원을 전달하는 데 사용됩니다. - 모든 클라이언트가 세션의 공유 부분을 업데이트합니다. 이 경우 세션의 공유 부분에 대한 모든 업데이트는 동기화되어야 합니다. 그러나 타이틀은 여전히 동기화 없이 자체 구성원 영역에 쓸 수 있습니다.
Multiplayer API를 사용한 세션 동기화 업데이트
다음 멀티플레이어 API 메서드는 낙관적 동시성을 구현합니다. 각 쓰기 메서드는 XblMultiplayerSessionWriteMode 값을 허용합니다. 값SynchronizedUpdate를 전달하면 업데이트에 낙관적 동시성을 사용합니다.
열거형의 다른 값은 세션 초기 생성 시 잠재적인 충돌을 해결하는 데 도움이 됩니다.
다른 타이틀이 잠재적으로 쓸 수 있는 MPSD 세션 부분에 대한 쓰기는 반드시 동기화된 업데이트를 사용해야 합니다.
그러나 모든 쓰기가 보호되어야 하는 것은 아닙니다.
타이틀이 쓰기 세션 메서드 중 하나를 사용하여 로컬 세션 개체를 MPSD에 쓰려고 시도하는 경우 HTTP/412 상태 코드를 받을 수 있습니다. 이 경우 다시 쓰기를 시도하기 전에 XblMultiplayerGetSessionAsync 호출을 실행하여 세션의 최신 서버 버전을 얻어 로컬 복사본을 새로 고쳐야 합니다.
그렇지 않으면 로컬 세션 문서에 잘못된 데이터가 계속 포함되고, 세션 쓰기 호출은 계속 실패합니다.
타이틀이 쓰기 세션 메서드 중 하나를 호출하면 업데이트된 세션 버전이 반환될 수 있습니다.
세션의 업데이트된 버전이 반환되면 타이틀은 스레드 안전한 방식으로 로컬 캐시된 복사본을 새 버전으로 대체해야 합니다.
Multiplayer REST API를 사용한 세션 동기화 업데이트
MPSD는 ETag 설정과 함께 HTTP “if-match” 헤더 및 읽기-수정-쓰기 패턴을 사용하여 REST 기능을 통한 세션 업데이트에서 낙관적 동시성을 지원합니다. 쓰기 요청에서 전달되는 ETag는 이전 읽기 요청에서 MPSD가 반환한 것이어야 합니다. 이 항목의 맨 위로 돌아가기.MPSD 호출
타이틀은 다음과 같은 방법으로 MPSD에 액세스하여 멀티플레이어 시스템 및 매치메이킹을 사용할 수 있습니다.- RESTful 기능에 대한 래퍼 역할을 하는 클래스가 포함된 멀티플레이어 API 사용을 권장합니다. 자세한 내용은
XblMultiplayer접두사 함수를 참조하세요. SmartMatch 매치메이킹에는XblMatchmaking접두사 함수로 표시되는 매치메이킹 API를 사용하세요. - XBOX services RESTful reference에 포함된 멀티플레이어 및 매치메이킹 REST API에 대한 직접적인 표준 HTTP 호출을 사용합니다. 해당 URI는 Session Directory URIs(멀티플레이어) 및 Matchmaking URIs(매치메이킹) 섹션에 설명되어 있습니다. 관련된 JSON 객체는 JavaScript Object Notation(JSON) Object Reference 섹션에 설명되어 있습니다.
Multiplayer API를 사용하여 MPSD 호출
XSAPI의 멀티플레이어 및 매치메이킹 API를 사용하여 MPSD를 호출하는 것을 권장합니다.이 예제는 멀티플레이어 및 매치메이킹 API와 XSAPI의 기타 요소를 사용하여 작성되었습니다.
Multiplayer REST API를 사용하여 MPSD와 상호 작용
타이틀 또는 해당 서비스는 멀티플레이어 REST API 및 매치메이킹 REST API에 대한 표준 HTTP 호출을 사용할 수 있습니다. REST 기능을 직접 사용할 때 호출자는 대부분의 작업에 대해 세션 디렉터리 URI에 대해DELETE, PUT, POST 및 GET 호출을 실행합니다.
PUT 요청 시 요청 본문은 기존 세션에 병합됩니다.
기존 세션이 없는 경우, 요청 본문은 Partner Center에 저장된 세션 템플릿과 함께 새 세션을 만드는 데 사용됩니다.
모든 필드는 선택 사항이며 델타만 지정해야 합니다.
따라서 {}는 델타가 0인 유효한 PUT 요청입니다.
서버의 공식 세션 사본에 영향을 주지 않고 병합 결과를 반환하는 가상의 PUT 요청을 수행하려면 PUT 요청에 쿼리 문자열 ?nocommit=true를 추가하면 됩니다.
멀티플레이어 및 매치메이킹 REST API 메서드의 요청 및 응답은 JSON 문서입니다.
멀티플레이어 세션 요청 구조는 MultiplayerSessionRequest (JSON)를 참조하세요.
관련 응답 구조는 MultiplayerSession (JSON)에 나와 있습니다.
응답 구조는 세션 구성원을 연결 리스트로 프레이밍하고 세션 및 해당 구성원의 다른 읽기 전용 속성을 채웁니다.
세션 및 세션 템플릿에 대한 쿼리(REST)
타이틀은 서비스 구성 및 세션 템플릿 수준에서 세션 정보를 쿼리할 수 있습니다. 이 섹션에서는 멀티플레이어 REST API를 사용하는 쿼리를 설명합니다.기본 세션 정보에 대한 쿼리
세션 디렉터리 및 매치메이킹 URI를 사용하여 기본 세션 정보에 대한 쿼리를 설정할 수 있습니다. 쿼리 결과는 세션 참조의 JSON 배열이며, 일부 세션 데이터가 인라인으로 포함됩니다. 기본적으로 쿼리는 최대 100개의 비공개가 아닌 세션을 검색합니다.모든 쿼리에는 키워드 필터, XUID 필터 또는 둘 다 포함해야 합니다.
세션 템플릿에 대한 쿼리
SCID에 대한 세션 템플릿 목록과 특정 세션 템플릿의 세부 정보를 검색하려면 다음 URI 중 하나에 대해GET 메서드를 사용하세요.
- /serviceconfigs//sessiontemplates
- /serviceconfigs//sessiontemplates/
세션 상태에 대한 쿼리
세션 상태를 쿼리하려면 다음 URI 중 하나에 대해GET 메서드를 사용하세요.
- /serviceconfigs//sessions
- /serviceconfigs//sessiontemplates//sessions
Multiplayer Session Explorer
Multiplayer Session Explorer는 MPSD에 내장된 도구로, 세션, 세션 템플릿 및 지역화 문자열을 탐색하는 데 사용됩니다. 이 도구는 개발 샌드박스에서만 사용하도록 의도되었습니다.Multiplayer Session Explorer 액세스
이 도구를 사용하려면 로그인해야 합니다. 탐색은 로그인한 사용자를 구성원으로 포함하는 세션으로 제한됩니다.
RETAIL 샌드박스에서 도구에 액세스하려고 하면 HTTP/404 상태 코드가 표시됩니다. 이 코드에 대한 자세한 내용은 Multiplayer 세션 상태 코드를 참조하세요.
기본 페이지 열기
- 도구의 기본 페이지를 엽니다. 보안 컨텍스트(로그인한 사용자 및 샌드박스)와 샌드박스의 SCID 목록이 표시됩니다.
- URI를 다시 입력할 필요가 없도록 이 페이지를 홈에 고정하려면 메뉴 버튼을 누릅니다.
사용 가능한 세션 및 템플릿 표시
- 도구에서 SCID를 선택하여 로그인한 사용자를 구성원으로 포함하는 해당 SCID의 세션 목록을 표시합니다.
- 같은 페이지에서 SCID를 선택하여 해당 SCID의 서비스 구성에 있는 세션 템플릿 및 지역화 문자열을 표시할 수 있습니다. 이러한 항목은 Partner Center를 통해 수집됩니다.
세션의 전체 내용 표시
Multiplayer Session Explorer에서 세션 이름을 선택하여 해당 세션의 전체 내용을 표시합니다. MPSD에서 표시되는 세션은 다음과 같은 이유로 세션 URI에 대한 표준GET 메서드의 응답과 다를 수 있습니다.
- GET 호출은 X-Xbl-Contract-Version 헤더에서 이전 계약 버전을 사용할 수 있습니다. Multiplayer Session Explorer는 항상 최신 계약 버전을 사용하여 세션을 표시합니다.
-
GET을 통해 세션이 정상적으로 요청되는 경우, 만료된 시간 초과와 같은 변환 및 부수 효과가 트리거될 수 있습니다. Multiplayer Session Explorer는 어떠한 로직, 변환 또는 부수 효과를 실행하지 않고 저장된 상태 그대로 세션의 스냅샷을 표시합니다. -
nextTimerJSON 객체 필드는 부수 효과와 같은 시점에 계산되기 때문에 MPSD 세션에 존재하지 않습니다.
참고 항목
- Multiplayer Session advanced topics 항목의 세션 개요 섹션
- Multiplayer 세션 상태 코드
- Multiplayer tasks 항목의 MPSD 세션 업데이트 섹션
- Multiplayer tasks 항목의 타이틀 활성화에서 MPSD 세션에 참가하기 섹션
- Multiplayer tasks 항목의 MPSD 세션 변경 알림 구독 섹션
- Matchmaking 개요
