멀티 플레이어 세션 고급 항목
이 항목을 사용하여 멀티 플레이어 세션의 고급 개념에 대해 알아봅니다.
이 항목에서는 다음에 대해 설명합니다.
- 세션 개요
- 멤버 속성
- 세션 기능
- 세션 크기
- 세션 사용자 상태
- 가시성 및 참가 가능성
- 세션 시간 제한
- 단일 콘솔에서 다중 사용자 로그인
- 프로세스 수명 주기 관리
- 비활성 세션 정리
- 세션 중재자
세션 개요
MPSD(멀티 플레이어 세션 디렉터리)의 세션에는 세션 이름이 있고, 세션 템플릿의 인스턴스로 식별됩니다. 세션 템플릿은 세션에 대한 기본 설정을 제공하는 JSON 문서입니다.
세션 템플릿은 GUID인 서비스 구성 식별자(SCID)가 포함된 서비스 구성의 일부분입니다. 세션 템플릿은 파트너 센터에 있습니다.
서비스 구성은 수집, 관리 및 보안 정책에 사용하는 개발자용 리소스입니다. MPSD를 통해 세션이 액세스될 때 파트너 센터를 통해 개발자가 설정한 액세스 정책에 따라 서비스 구성에 대해 주체 인증이 수행됩니다. 세션 멤버십 유효성 검사와 같은 보조 액세스 검사는 서비스 구성에 대한 액세스 인증 후 세션이 로드될 때 세션 수준에서 이루어집니다.
Important
템플릿을 통해 설정된 기능은 MPSD에 대한 쓰기를 통해 변경할 수 없습니다. 이 값을 변경하려면 필요한 변경 사항이 적용된 새 템플릿을 만들어서 제출해야 합니다. 템플릿을 통해 설정되지 않는 모든 항목은 MPSD에 쓰기를 통해 변경할 수 있습니다.
계약 버전 번호
이 항목에서는 서식 파일이 현재 Xbox One(또는 이상)용 현재 MPSD에서 사용하는 계약 버전 107을 사용한다고 가정합니다.
세션 참조
각 MPSD 세션은 XblMultiplayerSessionReference 구조에 따라 멀티 플레이어 API에 표시되는 세션 참조로 고유하게 참조됩니다. 세션 참조에는 다음 문자열 값이 포함됩니다.
- 서비스 구성 식별자(SCID)
- 세션 템플릿 이름
- 세션 이름
세션 참조는 다음과 같이 세션을 식별하기 위해 URI에 매핑됩니다.
다음 매핑 예시에서 authority
은(는) sessiondirectory.xboxlive.com입니다.
https://{authority}/serviceconfigs/{service-config-id}/sessiontemplates/{session-template-name}/sessions/{session-name}
세션의 요소
각 세션에는 변경 가능성 및 보안 규칙을 적용하는 요소 그룹이 포함되어 있습니다. 읽기 전용 유지 관리 정보(메타데이터)와 함께 세션 요소에 따라 달라집니다. 이 섹션에서는 세션을 구성하는 JSON 파일에 포함된 세션 요소 그룹을 설명하고, 선택한 템플릿에 대한 JSON에 포함된 세션 요소 그룹을 설명합니다.
참고 항목
HTTP/REST 구현에 사용자 지정 래퍼를 사용하는 경우 세션 및 템플릿에서 구현의 기능을 정확하게 반영하는 JSON 개체를 정의해야 합니다.
두 개의 내부 개체는 각 요소 그룹 내에 있습니다.
시스템 개체: 이러한 개체에는 MPSD에서 적용하고 해석하는 고정 스키마가 있습니다. 유효성을 검사하고 병합합니다. MPSD는 그 의미를 정의하고 알고 있기 때문에 작동할 수 있습니다. 각 시스템 개체에 대한 전체 정의는
XblMultiplayerSession
접두사 및 세션 디렉터리 URI 모두에 대한 참조를 확인하세요.사용자 지정 개체: 이러한 개체는 선택 사항이며 스키마를 포함하지 않습니다. 멀티 플레이어 게임 관련 메타데이터를 저장하는 데 사용됩니다. MPSD는 이 데이터를 해석할 수 없으므로 작동하지 않습니다. 게임 데이터 또는 저장된 정보는 TMS(타이틀 관리 저장소)에 저장되어야 합니다. TMS에 대한 자세한 내용은 Xbox 서비스 타이틀 저장소 개요를 참조하세요.
다음은 사용자 지정 JSON 개체의 예시입니다.
"custom": {
"myField1": true,
"myField2": "string",
"myField3": 5.5,
"myField4": { "myObject": null },
"myField5": [ "my", "array" ]
}
세션 상수
세션 상수는 생성 시에만 작성자 또는 세션 템플릿에 의해 설정됩니다.
/constants/system
개체는 MPSD를 통해 알 수 있으므로 멀티플레이어 시스템에 대한 상수를 정의하는 데 사용됩니다.
이 개체와 연결된 래퍼는 XblMultiplayerSessionConstants 구조로 표시됩니다.
/constants/system
개체는 여러 항목을 정의할 수 있습니다. 여기에는 capabilities
개체, metrics
개체, managedInitialization
(템플릿 계약 버전 104 또는 105) 또는 memberInitialization
(계약 버전 107) 개체, peerToPeerRequirements
개체, peerToHostRequirements
개체 및 measurementsServerAddresses
개체가 포함됩니다.
세션 속성
/properties/system
개체를 사용하여 MPSD에 대한 세션 속성을 정의합니다.
이 개체와 연결된 래퍼는 XblMultiplayerSessionProperties 구조입니다.
세션 속성은 언제든지 세션 구성원이 쓸 수 있습니다.
JSON 형식의 세션 속성의 예시는 joinRestriction
, initializationSucceeded
및 matchmaking
개체입니다.
이 요소 그룹의 사용에 대한 예시는 대상 세션 초기화 및 QoS를 참조하세요.
멤버 상수
각 세션 멤버에 대해 참가 시 멤버 상수를 설정합니다.
JSON 개체는 /members/{index}/constants/system
입니다.
세션 멤버를 나타내는 래퍼 클래스는 XblMultiplayerSessionMember 구조입니다.
멤버 속성
구성원 속성은 세션 구성원만 쓸 수 있습니다.
/members/{index}/properties/system
개체에 설정되고 XblMultiplayerSessionMember 구조의 요소를 반영합니다.
예제는 다음과 같습니다.
{
// These flags control the member status and "activeTitle" and are mutually exclusive (it's an error to set both to true).
// For each, false is the same as not present. The default status is "inactive"; that is, neither present.
"ready": true,
"active": false,
// Base-64 blob, or not present. An empty string is the same as not present.
"secureDeviceAddress": "ryY=",
// During member initialization, if any members in the list fail, this member will also fail.
// Can't be set on large sessions.
"initializationGroup": [ 5 ],
// List of the groups I'm in and the encounters I just had.
// An encounter is a brief interaction with a group. When an encounter is reported, it counts as retroactively joining the group 30 seconds ago and just now leaving.
// Group names use the session name validation rules (like case-insensitive).
// On large sessions, groups are used to report who played with whom (rather than just session membership). Members
// who are active in at least one group together at the same time are counted as playing together.
// Empty lists are the same as no value specified.
// The set of encounters is a point-in-time property, so it's immediately consumed and will never appear on a response.
"groups": [ "team-buzz", "posse.99" ],
"encounters": [ "CoffeeShop-757093D8-E41F-49D0-BB13-17A49B20C6B9" ],
// Optional list of role preferences that the player has specified for role-based game modes.
// All role names have to match across all members in the session. Role weights are
// defined from 0-100.
"RolePreference": { "medic": 75, "sniper": 25, "assault": 50, "support": 100 },
// Quality of Service (QoS) measurements by lowercase device token.
// Like all fields, "measurements" must be updated as a whole. It should be set once when measurement is complete, not incrementally.
// Metrics can be omitted if they weren't successfully measured; that is, the peer is unreachable.
// If a "measurements" object is set, it can't contain an entry for the member's own address.
"measurements": {
"e69c43a8": {
"bandwidthDown": 19342, // Kilobits per second.
"bandwidthUp": 944, // Kilobits per second.
"custom": { }
}
// QoS measurements by game-server connection string. Like all fields, "serverMeasurements" must be updated as a whole, so it should be set once when measurement is complete.
// If empty, it means that none of the measurements were completed within the "serverMeasurementTimeout".
"serverMeasurements": {
"server farm a": {
"latency": 233 // Milliseconds.
}
},
// Subscriptions for shoulder taps on session changes. The "profile" indicates which session changes to tap and other properties of the registration like the minimum time between taps.
// The subscription is named with a title-generated GUID that's also sent back with the tap as a context ID.
// Subscriptions can be added and removed individually, without affecting other subscriptions in the "subscriptions" object.
// To remove a subscription, set its context ID to null.
// (Like the "ready" and "active" flags, the "subscriptions" data is copied out and maintained internally, so the normal replace-all rule on system fields doesn't apply to "subscriptions".)
// Can't be set on large sessions.
"subscriptions": {
"961dc162-3a8c-4982-b58b-0347ed086bc9": {
"profile": "party", // Or "matchmaking", "initialization", "roster", "queuehost", or "queue".
"onBehalfOfTitleId": "3948320593", // Optional decimal title ID of the registered channel. If not set, the title ID is taken from the token.
},
"709fef70-4638-4b94-905b-24cb02706eb5": null
}
}
서버 요소
서버는 세션에 참가하거나 초대된 비사용자입니다.
연결된 JSON 개체는 /servers/{server-name}/constants/system
및 /servers/{server-name}/properties/system
입니다.
이러한 개체는 서버만 쓸 수 있습니다.
참고 항목
/servers/{server-name}/constants/system
개체는 현재 사용되지 않습니다.
세션 구성
다음과 같은 방법으로 세션의 구성을 제어할 수 있습니다.
- 파트너 센터를 통해 수집된 세션 서식 파일을 사용합니다.
- 멀티플레이어 및 게임을 만드는 API 또는 REST API에 대한 요청을 사용하세요. 여전히 템플릿을 사용해야 하지만 템플릿에 구성하려는 값을 포함하지 않아도 됩니다. 타이틀에서 템플릿에 이미 설정된 상수를 재정의할 수는 없습니다.
세션 자체를 정의하도록 별도의 JSON 문서가 제공됩니다. 또한 특정 타이틀에 필요한 래퍼 기능을 구현해야 합니다. JSON 문서 및 래퍼 코드의 내용은 서로를 정확히 반영하고 최신 템플릿 계약 버전을 반영해야 합니다.
세션의 스키마는 세션 버전(주 버전) 및 프로토콜 개정(부 버전)과 함께 버전 관리됩니다. 버전은 X-Xbl-Contract-Version에 "100 * major + minor" 헤더로 결합됩니다. 예를 들어 최신 템플릿 계약 버전이 107이라고 가정하면 v1.7 타이틀의 모든 REST 요청에 다음 헤더가 포함됩니다. X-Xbl-Contract-Version: 107.
참고 항목
대부분의 타이틀(XSAPI(Xbox 서비스 API) 사용)은 계약 버전 105 및 세션 템플릿 버전 107을 사용하는 것이 좋습니다.
세션 템플릿
각 세션 템플릿은 서비스 구성의 일부분인 JSON 문서로 생성되는 세션에 대한 프레임워크를 정의하고 새 세션에 대한 상수를 제공합니다. 자세한 내용은 멀티 플레이어 세션 템플릿을 참조하세요.
세션 기능
기능은 MPSD에서 해당 세션에 적용해야 하는 동작을 구성하는 MPSD 세션의 상수입니다. 가장 일반적으로 파트너 센터를 사용하여 세션 템플릿의 기능을 설정합니다.
기능은 /constants/system/capabilities
개체에서 설정됩니다.
기능이 필요하지 않은 경우 빈 capabilities
개체를 사용합니다.
참고 항목
타이틀은 멀티플레이어 API나 게임을 만드는 API를 사용하여 세션 기능을 변경하거나 액세스하지 않습니다.
세션 기능은 XblMultiplayerSessionCapabilities 구조로 표시됩니다. 세션에서 지원할 수 있는 항목을 나타내는 부울 값입니다.
- Connectivity
- Gameplay
- 대규모 크기
- 활성 구성원에 필요한 연결
XblMultiplayerSessionConstants 구조에는 세션 기능에 관련된 다음 속성을 정의하는 SessionCapabilities
멤버(XblMultiplayerSessionCapabilities 유형)가 포함되어 있습니다.
CapabilitiesConnectivity
CapabilitiesGameplay
CapabilitiesLarge
참고 항목
타이틀에서 동적 세션 기능을 정의한 경우 해당되는 속성은 세션 상수에 대해 true
(으)로 설정됩니다.
세션 크기
MPSD 세션의 크기는 세션 내 회원 수에 따라 결정됩니다.
최대 세션 크기
최대 세션 크기는 수용할 수 있는 최대 세션 구성원 수입니다.
XblMultiplayerSessionConstants::MaxMembersInSession
속성으로 표시됩니다.
최대 멤버 크기는 /constants/system
개체에 설정됩니다.
최대 세션 크기는 1~100명의 세션 멤버 사이이며 생성 시 설정되지 않은 경우 기본값은 100입니다. 필요한 크기가 100 이상인 경우 해당 세션을 "대규모" 세션이라 하며 특별한 방식으로 설정됩니다.
연결 해제
세션에 대한 최대 크기를 설정하면 특정 연결 해제 시나리오 도중 열린 슬롯이 가득 찬 것으로 표시될 수 있습니다. 예를 들어 플레이어가 네트워크 또는 전원 오류로 인해 연결이 끊어지면 지연이 세션에 즉시 반영되지 않습니다. 멤버는 연결 해제 감지 기능을 사용하여 비활성으로 설정됩니다. 자세한 내용은 멀티 플레이어 세션 디렉터리 개요 항목에서 MPSD 변경 알림 처리 및 연결 해제 감지 섹션을 참조하세요.
이에 반해 하트비트를 사용하여 연결 해제를 감지는 피어 메시는 대체로 2-3초 내에 연결 해제를 인지하고 즉시 플레이어 슬롯을 열 수 있습니다. 하지만 중재자는 다른 멤버를 제거할 수 없습니다.
대규모 세션
대규모 MPSD 세션에는 최대 1,000명의 멤버가 있을 수 있지만 모든 멤버 목록 가져오기와 같은 일부 세션 기능이 비활성화됩니다.
세션 크기는 XblMultiplayerSessionCapabilities::Large
속성으로 표시됩니다.
이 속성은 큰 세션을 나타내기 위해 true
(으)로 설정됩니다. "large" 기능은 /constants/system/capabilities
개체에 표시됩니다.
자세한 내용은 세션 기능을 참조하세요.
세션 사용자 상태
MPSD는 세션에 추가된 사용자의 상태로 사용자 상태를 정의합니다. 사용할 수 있는 사용자 상태는 XblMultiplayerSessionStatus 열거로 정의됩니다. 사용자는 세션에 추가되기 전에 "사용 가능" 상태로 간주됩니다.
XblMultiplayerSessionCurrentUserSetStatus를 사용하여 세션 사용자 상태를 변경할 수 있습니다.
게임 세션 JSON 문서에서 /members/{index}/properties/system
을(를) 올바르게 설정하여 REST를 변경합니다.
예약된 사용자 상태
중재자가 세션 내에 있는 열린 슬롯 중 하나를 채울 사용자를 선택하면 사용자는 예약된 사용자 상태에 배치됩니다. 이 상태에서 사용자는 아직 공식적으로 세션 초대를 수락하지 않았거나 세션에 참가하여 피어 연결을 시작하지 않았습니다.
활성 사용자 상태
사용자가 활성 상태일 때 타이틀은 사용자를 대신하여 세션에 참가하고, 사용자는 세션에 실제로 참가 중입니다. 사용자는 게임을 플레이하는 한 계속해서 이 상태를 유지합니다.
타이틀이 처음 시작될 때 일반적으로 세션 상태를 확인하여 사용자가 이미 어느 세션의 멤버인지 확인해야 합니다. 사용자가 세션 멤버인 경우 타이틀에서 게임으로 즉시 이동할 수 있고, 모든 참가 중인 로컬 멤버를 활성 사용자 상태로 설정할 수 있습니다.
게임을 하는 동안 사용자는 활성 상태를 유지해야 합니다. 사용자가 게임 내 UI를 사용하여 세션에서 나간 경우에는 XblMultiplayerSessionLeave를 호출하여 세션에서 사용자를 제거해야 합니다. 타이틀이 제한적일 때 사용자가 일시적으로 게임에서 나간 경우 타이틀은 적절한 시간 동안 사용자를 활성 상태로 유지해야 합니다.
사용자가 타이틀에서 지정된 시간 이후로도 돌아오지 않는 경우 사용자 상태를 비활성으로 변경하는 것이 적절합니다.
비활성 사용자 상태
비활성 상태에서는 사용자가 현재 게임에 참여하고 있지 않지만 세션에 저장된 슬롯이 있습니다. 다시 말해 이 사용자는 "활성 상태가 아닌" 사용자입니다.
세션에서 비활성 사용자 상태로 설정하는 것은 사용자 고유의 콘솔입니다. 중재자가 이 작업을 수행할 수 없습니다.
사용자가 비활성 상태가 되는 시나리오 예시는 다음과 같습니다.
타이틀에서 일시 중단 이벤트를 수신한 경우.
사용자가 타이틀에서 정의된 시간 동안 비활성 상태(입력 또는 컨트롤러 반응이 없음)인 경우. 경쟁 멀티 플레이어 게임에서는 2분을 권장합니다.
타이틀이 2분 또는 타이틀에서 정의한 시간 이상 동안 제한 모드인 경우. 이 제한 모드 제한 시간은 사용자가 타이틀에서 관련 앱 또는 타이틀 관련 기타 환경을 사용하지 않을 수 있는 것으로 예상되는 시간입니다.
사용자가 세션에서 즉시 연결 해제된 경우. 자세한 내용은 멀티 플레이어 세션 디렉터리 개요 항목에서 MPSD 변경 알림 처리 및 연결 해제 감지 섹션을 참조하세요.
타이틀이 시작되고 특정 세션 멤버에 대한 사용자 상태가 비활성으로 설정된 경우 타이틀이 일시 중단되었거나 사용자가 세션에서 너무 오래 비활성 상태였습니다. 타이틀이 다시 시작 중이기 때문에 사용자가 속한 게임 세션을 재개하고자 한다는 표시입니다.
타이틀 시작 시 사용자의 상태가 활성이고, 이 상황이 네트워크 연결 해제로 인한 것이거나 중단되기 전에 타이틀에서 사용자를 비활성 상태로 설정할 수 없었던 다른 시나리오로 인한 것일 수 있습니다. 두 가지 경우 모두 타이틀에서 사용자를 게임에 다시 연결하고 다른 사용자가 계속 플레이하도록 하거나 세션에서 사용자를 제거해야 합니다.
세션 종료 시 사용자 상태
세션이 끝나면 게임 플레이가 중단됩니다. 타이틀은 XblMultiplayerSessionLeave를 사용하여 모든 사용자가 자신을 제거할 수 있도록 허용해야 합니다. 사용자와 연결된 세션 활동은 세션에서 나갈 때 자동으로 지워집니다.
가시성 및 참가 가능성
세션 액세스는 MPSD 수준에서 2가지 설정으로 제어됩니다. 세션 가시성과 세션 참가 가능성입니다. 이 항목에서 제공하는 가시성 및 참가 가능성 권장 사항은 가장 일반적인 타이틀 시나리오에 적용됩니다. 가능하면 타이틀이 이러한 설정을 따라야 합니다. 타이틀 내 논리를 사용하여 새 플레이어가 세션에 참가 가능한지에 있어 최종적이고 권한 있는 결정을 내려야 합니다.
세션 가시성
세션 가시성은 세션 생성 시 설정된 상수로 표시됩니다. 일반적으로 세션 템플릿에서 정의되고 세션에 대한 읽기 및 쓰기 액세스 권한을 어떤 유형의 사용자에게 부여할지 결정합니다.
세션 표시 여부에 사용할 수 있는 값은 XblMultiplayerSearchHandleGetVisibility에서 정의됩니다.
JSON 파일의 표시 유형 상수에 허용되는 설정은 open
, visible
및 private
입니다.
권장되는 게임 세션 가시성은 open입니다.
공개 게임 세션에는 플레이어 예약이 필요하지 않으므로 초대 프로세스가 간소화됩니다.
중재자는 초대가 발송된 이후 MPSD에서 플레이어를 예약하지 않고, 로컬 방식으로 초대된 플레이어를 추적하기만 합니다. 이를 통해 플레이어는 즉시 중재자와 연결하여 세션에 참가할지, 참가가 거부되는지, 대기해야 하는지(대기 중인 플레이어가 지원되는 경우) 여부를 결정할 수 있습니다.
중재자는 최종 기관입니다. 응답하고 새 멤버에게 세션에 머무르거나 나가도록 지시합니다.
열린 게임 세션 가시성을 사용하는 경우 최종 결정이 이루어지기 전에 초대된 플레이어가 타이틀을 실행하고 중재자와 연결해야 합니다. 세션이 가득 차거나 초대가 거부된 경우 사용자에게 오류 메시지를 표시할 수 있습니다.
중재자와의 연결을 설정하려면 안전한 디바이스 주소가 필요합니다.
XblMultiplayerSessionProperties::HostDeviceToken
속성은 세션의 현재 중재자인 세션 멤버와 초대된 플레이어가 연결에 사용해야 하는 보안 장치 주소를 찾는 데 사용됩니다.
세션 참가 가능성
세션 참가 가능성은 어떤 유형의 사용자가 세션에 참가할 수 있는지 결정합니다. 세션 도중 동적으로 설정될 수 있습니다.
세션 조인 가능성의 가능한 값은 다음과 같습니다.
- None(기본값): 세션에 참가할 수 있는 사용자에 대한 제한이 없습니다.
- Local: 로컬 사용자만 세션에 참가할 수 있습니다.
- Followed: 로컬 사용자 및 다른 세션 멤버가 팔로우하는 사용자만 예약 없이 세션에 참가할 수 있습니다.
세션 중재자는 참가 가능성 설정을 통해 비공개 세션을 만들 수 있습니다. 참가 가능성을 Local 또는 Followed로 설정하면 세션에 대한 액세스가 제한되고 비공개 상태가 됩니다.
또한 중재자는 세션 참가 가능성을 추적하여 필요한 경우 이전 세션 초대가 호스트 수준에서 거부될 수 있도록 해야 합니다. 예를 들어 초대된 플레이어가 세션이 이미 가득 찰 때까지 세션에 참가하지 않은 경우 중재자는 참가 중인 플레이어에게 세션이 잠겼으며 자동으로 세션을 나가야 한다고 지시할 수 있습니다.
세션 시간 제한
세션은 타이머 및 기타 외부 이벤트에 의해 변경될 수 있습니다. 세션 시간 제한은 세션 멤버가 자동으로 비활성 상태가 되거나 세션에서 제거되기 전까지 특정 상태를 유지할 수 있는 시간을 정의합니다. MPSD는 또한 세션 수명을 관리하기 위해 시간 제한을 지원합니다.
참고 항목
시간 제한 설정은 템플릿 계약 버전 104 또는 105에 대해 /constants/system/timeouts
또는 관리되는 초기화 개체 내에서 이루어집니다. 버전 107 이상의 경우 설정은 /constants/system
또는 관리되는 초기화 개체에서 개별적으로 이루어집니다.
타이머가 만료되면 MPSD에서 자동으로 세션을 업데이트하고 변경을 즉시 중재자에게 알리지 않습니다. 세션 및 시간 제한 상태는 읽기 또는 쓰기 요청이 전송되기 직전에만 업데이트됩니다. 즉시 업데이트하면 반환된 데이터가 최신 상태가 됩니다.
참고 항목
세션 시간 제한은 누적되지 않습니다. 업데이트의 각 세션 멤버에 대해 상태 전환에는 하나만 적용됩니다.
현재 정의된 시간 제한
이 섹션에서는 현재 MPSD에서 정의한 시간 제한에 대해 설명합니다.
- 모든 시간 제한은 밀리초 단위로 지정됩니다.
- 값 0이 허용되며, 즉시 시간 제한이 적용됩니다.
- 값이 없는 시간 제한은 무한대로 간주됩니다.
시간 제한에는 기본값이 있기 때문에 무한 시간 제한의 경우 명시적으로 null
을(를) 지정해야 합니다.
evaluationTimeout
이 시간 제한은 세션 멤버가 평가 결정을 내리고 업로드하는 시간을 나타냅니다. 어떠한 결정도 수신되지 않은 경우 결정은 실패로 간주됩니다. 이 시간 제한은 관리되는 초기화 개체에 배치됩니다.
inactiveRemovalTimeout
이 시간 제한은 세션에 참가했지만 현재 게임에 참가하지 않는 세션 멤버에 대해 설정됩니다. 기본적으로 멤버는 2시간 후 세션에서 제거됩니다.
참고 항목
이 제한 시간은 템플릿 계약 버전 104 또는 105에 대한 비활성 시간 제한으로 지정됩니다.
대부분의 경우 비활성 시간 제한을 0으로 설정하는 것이 좋습니다. 이렇게 하면 비활성 상태로 설정된 모든 사용자가 세션에서 즉시 제거되고 해당 슬롯이 정리되기 때문입니다. 이 동작은 사용자가 비활성 상태가 되었거나 비활성 상태에 도달한 경우 새 플레이어를 신속하게 추가할 수 있도록 경쟁적인 멀티 플레이어 게임에 가장 적합합니다.
협동 및 기타 멀티 플레이어 디자인의 경우 타이틀에서 연결이 해제되거나 일정 기간 동안 타이틀에 참여하지 않는 사용자에게 다시 연결할 수 있는 시간을 허용하고자 할 수 있습니다. 한 가지 솔루션이 모든 디자인 시나리오에 맞는 경우는 없습니다.
joinTimeout
이 시간 제한은 사용자가 세션에 참가해야 하는 시간(밀리초)을 나타냅니다. 세션에 참가하지 못한 사용자에 대한 예약은 제거됩니다. 이 시간 제한은 관리되는 초기화 개체에 배치됩니다.
measurementTimeout
이 시간 제한은 세션 멤버가 측정값을 업로드해야 하는 시간을 나타냅니다. 측정값을 업로드하지 못하는 멤버의 경우 "timeout"이라는 실패 이유가 표시됩니다. 이 시간 제한은 관리되는 초기화 개체에 배치됩니다.
참고 항목
매치 메이킹 도중 QoS 측정에 대한 45초 제한 시간이 적용됩니다. 따라서 매치 메이킹 중 30초 이하의 측정 시간 제한을 사용하는 것이 좋습니다.
readyRemovalTimeout
이 시간 제한은 세션에 참가했고 게임에 참가하려 하는 세션 멤버에 대해 설정됩니다. 일반적으로 이는 타이틀을 대신해 셸이 사용자를 참가시켰고 타이틀이 실행 중임을 의미합니다. 기본적으로 멤버는 세션에서 제거되고 3분 후에 비활성 상태가 됩니다.
참고 항목
이 제한 시간은 계약 버전 104 또는 105에 대한 준비 시간 제한으로 지정됩니다.
reservedRemovalTimeout
이 시간 제한은 다른 누군가에 의해 세션에 추가되었지만 아직 세션에 참가하지 않은 세션 멤버에 대해 설정됩니다. 시간 제한이 만료되면 예약이 삭제되고 멤버는 비활성 상태로 간주됩니다. 기본값은 30초입니다.
참고 항목
이 제한 시간은 계약 버전 104 또는 105에 예약된 시간 제한으로 지정됩니다.
sessionEmptyTimeout
이 시간 제한은 삭제 시 세션이 비워진 후의 시간(밀리초)을 나타냅니다. 기본값은 0입니다
참고 항목
이 제한 시간은 계약 버전 104 또는 105에 대한 sessionEmpty
제한 시간으로 지정됩니다.
세션 시간 제한 예시
4명의 플레이어로 세션이 시작됩니다.
2명의 플레이어 A와 B는 정전으로 인해 연결이 끊어졌습니다. 해당 게임의 상태는 활성으로 유지됩니다.
다른 두 플레이어(C 및 D)는 XblMultiplayerSessionLeave를 사용하여 제대로 종료합니다.
세션은 열린 상태로 유지됩니다. 플레이어 A와 B의 연결이 끊어졌지만 여전히 활성 상태입니다.
며칠 후 플레이어 A가 돌아와 게임을 시작합니다.
플레이어 A의 게임에서는 플레이어 A가 멤버인 세션을 확인하고(읽기 수행), 며칠 전의 분리된 세션을 찾습니다.
세션에서는 여전히 세션에 존재하는 두 플레이어(A 및 B)에 대한 프레즌스 검사를 수행합니다.
- 플레이어 A가 타이틀을 실행 중이므로 플레이어 A에 대한 현재 상태 확인이 성공합니다. 매치에서 플레이어의 활성 상태는 동일하게 유지됩니다.
- 플레이어 B는 타이틀을 실행하고 있지 않습니다. 결과적으로 플레이어 B에 대한 현재 상태 확인이 실패합니다. 이 서비스는 플레이어 B의 상태를 비활성 상태로 설정합니다. 이 시점에서 플레이어 B에 대한 비활성 시간 제한이 시작됩니다.
플레이어 A는 XblMultiplayerSessionLeave 메서드를 사용하여 세션을 제대로 종료합니다.
모든 사용자가 수행한 다음 읽기 또는 쓰기에 세션에서 제거된 플레이어 B에 대해 비활성 시간 제한이 만료됩니다.
이제 세션의 멤버 수는 0이고, 세션은 서비스에서 제거됩니다.
예시 세션에 대한 비활성 시간 제한이 0으로 설정된 경우 플레이어 B는 7.1 단계의 현재 상태 확인 직후 시간 제한이 초과되고, 세션 쓰기에 의해 제거되었을 수 있습니다. 이 경우 세션에 대한 추가 읽기 또는 쓰기를 수행할 필요 없이 세션이 종료됩니다.
단일 콘솔에서 다중 사용자 로그인
여러 명의 사용자가 동일한 본체에 로그인할 때 다른 사용자가 세션에 없거나 현재 타이틀에서 활성 상태가 아닌 경우에도 일부 사용자는 게임 세션 내에 존재할 수 있습니다. 여러 사용자에 대해 게임 초대가 수신 및 수락될 수 있으며, 게임 세션 멤버십에 영향을 미칠 수 있습니다. 모든 세션 멤버 자격 시나리오를 올바르게 처리할 수 있도록 타이틀에 대해 이 정보를 고려합니다.
일반적인 시나리오에서 새 플레이어가 로그인하고, 게임에서 활성 상태가 되고, 기존 게임 세션에 추가되어야 합니다. 새 게임 세션을 만드는 것과 마찬가지로 타이틀에서 게임 플레이 도중 적절한 경우에만 사용자를 추가해야 합니다.
로그인한 여러 사용자를 포함하여 하나 이상의 사용자가 다른 게임 세션에 대한 초대를 수신할 수 있습니다. 타이틀에서 특정 방식으로 이러한 시나리오를 처리할 필요는 없습니다. 세션 상태와 구성원 이벤트는 게임 세션과 사용자 멤버십의 모든 업데이트를 타이틀에 알려줍니다.
온라인 세션에 대해 다중 로그인 사용자를 처리하려면 타이틀이 각 사용자에 대해 별도의 XboxLiveContext Class
개체를 사용하여 모든 사용자에 대한 숄더 탭을 구독합니다.
타이틀에서 XblMultiplayerSessionInfo::ChangeNumber
속성을 사용하여 세션을 변경하고 중복 숄더 탭을 무시합니다.
프로세스 수명 주기 관리
멀티 플레이어가 아닌 타이틀과 마찬가지로 멀티 플레이어 세션의 타이틀 역시 타이틀 일시 중단 및 프로세스 수명 주기 이벤트 종료가 발생할 수 있습니다. 따라서 세션 중재자는 주기적으로 세션 상태를 저장해야 합니다.
중재자가 일시 중단된 경우 타이틀은 중재자 마이그레이션을 시도하고 게임 상태를 적절하게 저장해야 합니다. 그러면 새 중재자가 세션 상태를 복원할 수 있습니다. MPSD에서 세션이 여전히 유효하다면 전체 멀티 플레이어 세션이 일시 중단되었다가 나중에 재개되는 것도 가능합니다.
일반적으로 게임 호스트인 단 하나의 지정된 피어가 전체 게임 상태를 업데이트해야 합니다.
게임 메타데이터 저장
타이틀은 MPSD 세션에 게임 메타데이터를 저장합니다. 게임 메타데이터는 세션 데이터를 표시하고 타이틀에서 게임 세션을 찾고 참가할 수 있도록 하는 데 필요한 정보입니다.
타이틀은 세션 멤버에 대한 사용자 지정 속성 섹션에 플레이어별 메타데이터를 저장합니다. 예를 들어 세션에 대한 플레이어 색 및 선호하는 플레이어 무기가 있습니다. 현재 맵과 같은 세션 전체 메타데이터는 MPSD 세션의 전역 사용자 지정 속성 섹션에 저장됩니다.
게임 상태 저장
게임 상태는 타이틀 저장소 서비스를 사용하여 TMS에 저장됩니다. 이 위치를 사용하는 저장소를 통해 타이틀에서 권한 문제 없이 중재자를 마이그레이션할 수 있습니다. 자세한 내용은 중재자 마이그레이션을 참조하세요.
참고 항목
타이틀이 일시 중단된 상태가 아닌 경우를 제외하고 5분에 1회보다 더욱 주기적으로 TMS에 게임 상태 저장을 시도해서는 안 됩니다.
비활성 세션 정리
sessionEmptyTimeout
이(가) 0으로 설정된 경우 마지막 플레이어가 세션을 나갈 때 MPSD 세션이 자동으로 삭제됩니다.
충돌 또는 연결 해제 후 사용되지 않는 세션에서 플레이어가 포함되지 않도록 하는 방법을 알아보려면 멀티 플레이어 세션 디렉터리 개요 항목의 MPSD 변경 알림 처리 및 연결 해제 검색 섹션을 참조하세요.
충돌하거나 연결이 끊어진 후 사용하지 않은 세션을 부적절하게 처리하면 타이틀이 플레이어에 대한 세션을 쿼리할 때 문제가 발생할 수 있습니다.
타이틀에서 XblMultiplayerGetSessionAsync를 호출한 다음 세션을 평가하여 특정 사용자에 대한 모든 세션을 쿼리하도록 하여 비활성 세션을 정리하는 것이 좋습니다. 타이틀에서 오래된 세션을 발견하면 세션에 있는 모든 로컬 플레이어에 대해 XblMultiplayerSessionLeave를 호출합니다. 이 호출은 멤버 수를 0으로 떨어뜨리고 세션을 정리합니다.
세션 중재자
일부 멀티 플레이어 메서드는 게임 세션 내 하나의 클라이언트에서만 호출되어야 합니다. 이 클라이언트는 세션에 참여하는 콘솔 중 하나로, 중재자 또는 호스트라 합니다. 하나 이상의 세션 멤버가 게임에 있는 경우 세션에는 진행 중인 참가를 모니터링할 중재자가 있어야 합니다.
중재자 설정
클라이언트에서 세션을 만들 때 하나의 콘솔을 중재자로 지정합니다. 자세한 내용은 멀티 플레이어 작업 항목에서 MPSD 세션에 대한 중재자 설정 섹션을 참조하세요.
세션 상태 저장
프로세스 수명 주기 관리 섹션에 설명된 대로 중재자는 주기적으로 세션 상태를 저장해야 합니다. 새 중재자는 타이틀에 의한 중재자 마이그레이션이 발생하는 경우 세션 상태를 저장할 수 있어야 합니다. 자세한 내용은 중재자 마이그레이션을 참조하세요.
게임 세션 멤버 및 진행 중 참가 관리
세션 중재자의 가장 중요한 역할은 플레이를 위해 게임 세션에 찾아오는 사용자를 관리하는 것입니다. 여기에는 게임 초대 처리, 대기 중인 플레이어 알림 및 게임을 종료하는 플레이어 처리 등이 있습니다.
알림 받기
중재자는 XblMultiplayerSessionChangedHandler를 사용하여 게임 세션에 참여하려는 새 플레이어를 수신 대기해야 합니다.
빈 게임 세션 슬롯을 채울 플레이어 찾기
중재자가 다음 작업 중 하나로 비어 있는 게임 세션 슬롯을 채울 플레이어를 찾습니다.
- 타이틀에서 로비 세션이나 다른 메커니즘을 사용하여 지연 참가를 허용하는 경우, 해당 메커니즘을 사용하여 새 세션 구성원을 찾습니다.
- 다른 일치 티켓 세션을 만듭니다.
자세한 내용은 멀티 플레이어 작업 항목의 매치 메이킹 중 열린 세션 슬롯 채우기 섹션을 참조하세요.
초대를 받은 세션 멤버 처리
중재자는 초대를 받은 세션 멤버를 모니터링하고 단일 사용자에 대한 최소 초대 간격을 적용해야 합니다. 자세한 내용은 멀티 플레이어 작업 항목의 게임 초대 보내기 섹션을 참조하세요.