게임 세션 가시성
MPSD(Multiplayer Session Directory) 세션 액세스는 세션 가시성 및 세션 참여 가능성의 두 가지 설정에 의해 제어됩니다. 이러한 설정을 사용하여 MPSD 수준에서 세션 액세스를 제한할 수 있습니다. 액세스 제어의 첫 번째 측면은 세션 가시성입니다. 세션 가시성은 세션 생성 시 설정되는 상수입니다. 세션 가시성은 일반적으로 세션 템플릿에 정의되며 어떤 유형의 사용자가 세션에 대한 읽기 및 쓰기 액세스 권한을 가질지 결정합니다. 가시성 설정의 값은 다음과 같습니다.- Open: 모든 사용자가 세션에 대해 읽기 및 쓰기가 가능합니다.
- Visible: 모든 사용자가 읽을 수 있지만 참여한 플레이어와 예약된 플레이어만 세션에 쓸 수 있습니다.
- Private: 참여한 플레이어와 예약된 플레이어만 세션을 읽거나 쓸 수 있습니다.
가시성을 “private”로 설정하면 초대된 플레이어가
join() 호출을 재시도해야 할 수 있습니다. 플랫폼 UI를 통해 초대를 보낸 경우, 세션에서 예약되기 전에 다른 플레이어가 초대를 받을 수 있습니다. 이 경쟁 조건은 “private” 또는 “visible” 세션이 참여하는 플레이어에 대한 예약을 요구하기 때문에 초대된 플레이어의 join() 호출이 실패하게 할 수 있습니다.예약이 없는 경우 세션에서 액세스 오류(HTTP/403)가 발생합니다. 그러면 초대된 플레이어는 join() 작업을 재시도해야 합니다. 그러나 재시도는 5초마다보다 더 자주 시도해서는 안 됩니다. 플레이어에 대한 참여 흐름 중 경쟁 조건을 피하기 위해 타이틀이 세션 가시성을 “open”으로 설정할 것을 권장합니다.게임 세션 참여 가능성
액세스 제어의 두 번째 측면은 참여 가능성입니다. 세션 수명 동안 동적으로 설정할 수 있으며 어떤 유형의 사용자가 세션에 참여할 수 있는지 결정합니다. 세션 참여 가능성의 값은 다음과 같습니다.- None: (기본값) 세션에 참여할 수 있는 사람에 대한 제한이 없습니다.
- Local: 로컬 사용자만 세션에 참여할 수 있습니다.
- Followed: 로컬 사용자와 다른 세션 멤버가 팔로우하는 사용자만 예약 없이 세션에 참여할 수 있습니다.
게임 세션 참여 가능성은 파티 앱 UI에 반영되지 않습니다. 참여 가능성이 제한되어 있더라도 파티 앱 초대 UI와
ShowSendInvitesAsync는 게임 세션 초대를 허용합니다.게임 파티 참여 가능성
MPSD 세션을 제어하는 것 외에도 타이틀은 게임 파티 참여 가능성 상태에 대한 제어권을 가집니다. 이 설정을 사용하여 파티 수준에서 게임 파티 액세스를 제한할 수 있습니다. 파티 참여 가능성은 게임 파티가 생성될 때 동적으로 변경할 수 있습니다. 게임 파티의 참여 가능성 상태는 파티 초대 UI에 반영됩니다. 참여 가능성 상태는 다음과 같이 설정할 수 있습니다.- Invite-only: 이 설정은 게임 파티에 참여하려면 초대가 필요합니다.
- Joinable by Friends: (기본값) 이 설정은 플레이어가 게임 파티에 참여하려면 친구 관계가 필요합니다(파티에 참여하려면 파티 멤버가 참여하는 플레이어를 팔로우해야 함).
파티 참여 가능성은 세션 참여 가능성에 영향을 주지 않습니다. 그러나 파티 참여 가능성은 파티 앱 UI에 반영됩니다. 플레이어는 타이틀 외부의 파티 앱에서 파티 참여 가능성을 수동으로 변경할 수 있습니다.
권장 사항
다음 권장 사항은 가장 일반적인 타이틀 시나리오에 적용됩니다. 가능하면 타이틀은 이러한 설정을 따라야 하며, 새 플레이어가 세션에 입장하는지 여부에 대한 최종적이고 권위적인 결정을 위해 타이틀 내부 논리를 사용해야 합니다.권장 게임 세션 가시성: open
Open 게임 세션은 플레이어 예약이 필요하지 않습니다. 이는 초대 흐름을 단순화합니다. 초대가 전송된 후 세션 아비터나 호스트는 세션 문서에 플레이어를 예약하지 않습니다. 대신 세션 아비터나 호스트는 초대된 플레이어를 로컬에서만 추적합니다. 이렇게 하면 플레이어가 호스트에 즉시 연결하여 세션에 참여해야 하는지, 거부되어야 하는지, 대기해야 하는지(대기 플레이어가 지원되는 경우) 결정할 수 있습니다. 아비터나 호스트는 궁극적인 권한이며 새 멤버에게 세션에 머물거나 떠나도록 응답하고 지시합니다.이는 초대된 플레이어가 최종 결정이 내려지기 전에 타이틀을 실행하고 아비터나 호스트에 연결해야 합니다. 세션이 가득 차거나 초대가 거부된 경우 사용자에게 오류 메시지를 표시하는 것은 허용됩니다.
아비터나 호스트에 대한 연결을 설정하려면 보안 디바이스 주소가 필요합니다. 세션의
HostDeviceToken은 어떤 세션 멤버가 현재 세션의 아비터나 호스트인지, 그리고 초대된 플레이어가 어떤 보안 디바이스 주소에 연결해야 하는지를 나타내는 데 사용되어야 합니다.권장 게임 세션 참여 가능성: 기본값(설정하지 않음)
현재 게임 세션 참여 가능성은 파티 앱 UI에 영향을 주지 않으며 사용자에게 노출되지 않습니다. 타이틀 흐름을 단순화하려면 게임 참여 가능성은 기본값으로 유지하고 모든 참여 권한은 아비터나 호스트를 통해 처리해야 합니다.권장 게임 파티 참여 가능성
게임 파티 참여 가능성은 타이틀이 사용자에게 제공하려는 세션 유형에 따라 달라집니다. 두 가지 시나리오는 다음과 같습니다.- Open game: 오픈 게임의 경우 게임 파티 참여 가능성은 기본값인 “Joinable by Friends”로 두어야 합니다. 이렇게 하면 친구가 초대 없이 게임 파티(및 확장하여 게임 세션)에 참여할 수 있습니다.
- Private game: 비공개 또는 클로즈드 게임의 경우 게임 파티 참여 가능성을 “invite only”로 설정해야 합니다. 이는 다른 플레이어가 초대 없이 파티(및 확장하여 게임 세션)에 참여하는 것을 제한합니다.
플레이어는 파티 앱을 통해 게임 세션의 참여 가능성을 수동으로 변경할 수 있습니다.
최대 세션 크기
세션의 최대 멤버 크기는 게임 세션에 참여하는 플레이어 수를 제한하는 데 사용될 수 있습니다. 그러나 이 제한은 특정 연결 끊김 시나리오 중에 열려 있는 슬롯이 여전히 가득 찬 것처럼 보이게 할 수 있습니다. 예를 들어 네트워크나 전원 장애로 인해 플레이어가 연결이 끊어진 경우, 지연이 세션에 즉시 반영되지 않습니다. Presence 서비스가 연결 끊김을 감지하는 즉시(최대 20초) 멤버가 inactive로 설정됩니다. 그런 다음 inactive 시간 초과가 만료된 후 플레이어가 제거됩니다. 이에 비해 하트비트를 사용하여 연결 끊김을 감지하는 P2P 메시는 종종 2~3초 내에 연결 끊김을 인식하고 즉시 플레이어 슬롯을 열 수 있습니다. 그러나 아비터나 호스트는 다른 멤버를 제거할 수 없습니다. 이 문제를 해결하려면 세션의 최대 멤버 크기를 타이틀이 실제로 지원하는 최대 플레이어 수보다 항상 크게 설정해야 합니다. 예를 들어 플레이어 수가 8명인 경우 타이틀은 최대 세션 크기를 12로 설정해야 합니다. 이렇게 하면 이전 플레이어가 아직 시간 초과되지 않은 경우에도 새 플레이어가 참여할 수 있습니다. 아비터나 호스트는 세션이 가득 찼는지 결정하고, 새 플레이어가 여전히 참여할 수 있는지 결정하는 사용자 지정 세션 속성(IsFull : “true”)을 설정합니다.
이를 통해 참여하는 플레이어가 세션이 참여 가능한지 빠르게 확인할 수 있습니다.
아비터나 호스트는 또한 시간 초과된 멤버를 인덱스로 나타내는 사용자 지정 속성(예: TimedOutPlayers : “3, 5, 9”)을 유지해야 합니다.
이를 통해 새 플레이어가 현재 세션 멤버를 올바르게 식별할 수 있습니다.
대기 플레이어 알림
타이틀은 게임 파티 외에 대기 중인 플레이어 목록을 관리하여 대기 플레이어를 지원할 수 있습니다. 플레이어가 호스트에 연결하고 게임 세션이 가득 차면 플레이어가 호스트의 내부 대기 목록에 추가됩니다. 대기 중인 플레이어는 게임 세션에 참여하지 않지만 게임 파티에는 남아 있습니다. 네트워크 트래픽을 최소화하기 위해 대기 중인 플레이어는 이 시점에서 호스트와의 연결을 끊습니다.- 대기 중인 플레이어를 위한 게임 세션의 슬롯이 열리면 아비터나 호스트는 XblMultiplayerSessionAddMemberReservation을 호출하여 플레이어에 대한 예약을 추가합니다.
-
이 시점에서 대기 중인 플레이어는 아직 이 예약을 인식하지 못합니다. 결과적으로 아비터나 호스트는
PullReservedPlayersAsync메서드를 호출해야 합니다. 이는 알림 구성 및 타이틀 포커스 상태에 따라 예약된 모든 플레이어에게 UI 알림이나GameSessionReady알림을 발생시킵니다. - 새 플레이어는 이 알림을 받으면 호스트에 다시 연결하고 새 플레이어는 세션에 참여합니다.
타이틀이 일시 중단되거나 종료되면 플레이어가 게임 파티에서 자동으로 제거됩니다. 플레이어는 추가 알림을 받지 않습니다.
클라이언트 멀티플레이어 흐름


