다음을 통해 공유


멀티 플레이어 관리자 개요

이 주제에서는 세션, 매치메이킹 및 게임 초대를 관리하여 멀티 플레이어 기능을 추가하기 위한 고급 API에 대해 설명합니다. API는 상태 기반 및 이벤트 기반 프로그래밍 모델을 제공합니다.

Xbox 서비스는 게임에서 전 세계 Xbox 멤버를 연결할 수 있도록 타이틀에 멀티 플레이어 기능을 추가하기 위한 광범위한 지원을 제공합니다. 여기에는 다양한 매치메이킹 시나리오, 진행 중인 친구의 게임에 플레이어가 참여할 수 있는 기능 등이 포함됩니다.

멀티 플레이어 API를 직접 사용하여 Xbox 서비스 멀티 플레이어를 구현하는 작업은 복잡할 수 있습니다. 모범 사례를 따르고 인증 요구 사항을 충족하는지 확인하려면 상당한 수준의 설계와 테스트가 필요합니다.

멀티 플레이어 관리자를 사용하면 세션 및 매치메이킹을 관리하고 상태 기반 및 이벤트 기반 프로그래밍 모델을 제공하여 게임에 멀티 플레이어 기능을 쉽게 추가할 수 있습니다.

멀티 플레이어 관리자는 API 세트입니다. 피어 호스팅 멀티 플레이어 설계로 Xbox 서비스 게임에 대한 멀티 플레이어 시나리오를 쉽게 구현할 수 있도록 설계되었습니다.

멀티 플레이어 관리자는 친구와 멀티 플레이어 게임을 하고, 게임 초대를 처리하고, 진행 중인 참여, 매치메이킹 등을 처리하는 것과 같은 일반적인 멀티 플레이어 시나리오를 중심으로 하는 API를 제공합니다.

멀티 플레이어 관리자는 여러 로컬 사용자를 지원합니다. 또한 타사 매치메이킹 서비스를 사용하는 경우 타이틀을 MPSD(멀티 플레이어 세션 디렉토리)와 더 쉽게 통합할 수 있습니다. 이러한 시나리오 중 다수는 몇 번의 API 호출을 통해 달성할 수 있습니다.

주요 기능

멀티 플레이어 관리자 API의 주요 기능은 다음과 같습니다.

  • 손쉬운 세션 관리 및 Xbox 서비스 매치 메이킹
  • 상태 기반 및 이벤트 기반 프로그래밍 모델
  • 멀티 플레이어 XR 규격 준수와 함께 Xbox 서비스 모범 사례를 보장
  • 2015 멀티 플레이어 순서도 구현

멀티 플레이어 관리자 API 설계에 대한 중요한 정보는 다음과 같습니다.

Important

인증을 통과하려면 게임이 온라인 멀티 플레이어에 필요한 이벤트를 계속 구현해야 합니다.

개요

멀티 플레이어 관리자는 다음과 같은 핵심 개념을 중심으로 합니다.

  • 로비 세션: 장치에 로컬인 사용자와 함께 플레이하고 싶어하는 초대된 친구를 관리하는 데 사용되는 영구 세션입니다.

    그룹은 게임을 할 수 있습니다(예: 여러 라운드, 맵 및 수준). 로비 세션은 이 핵심 친구 그룹(장치에 로컬인 플레이어 포함)을 추적합니다. 일반적으로 이 그룹은 호스트가 메뉴를 탐색하고 그룹 구성원과 채팅하여 플레이할 게임 모드를 결정하는 동안 형성됩니다.

  • 게임 세션: 게임의 특정 인스턴스를 플레이하는 플레이어를 추적합니다.

    예를 들어, 종족, 지도 또는 레벨. 로비 세션의 구성원을 포함하는 XblMultiplayerManagerJoinGameFromLobby를 통해 새 게임 세션을 생성할 수 있습니다.

    멤버가 초대를 수락하면 로비 및 게임 세션에 추가됩니다(공간이 있는 경우).

    매치 메이킹이 활성화된 경우 추가 멤버가 게임 세션에 추가될 수 있지만 이러한 추가 플레이어는 로비 세션에 추가되지 않습니다. 따라서 게임이 종료되면 로비 세션의 플레이어는 여전히 함께 있지만 매치 메이킹의 추가 플레이어는 그렇지 않습니다.

  • XblMultiplayerManagerMember: 로컬 또는 원격 장치에서 로그인한 개별 사용자를 나타냅니다.

  • XblMultiplayerManagerDoWork: 타이틀과 Xbox 서비스 멀티 플레이어 서비스 사이에 적절한 게임 상태 업데이트가 유지되도록 보장합니다.

    최상의 성능을 보장하려면 XblMultiplayerManagerDoWork를 프레임당 한 번과 같이 자주 호출해야 합니다.

    XblMultiplayerManagerDoWork는 처리할 게임에 대해 XblMultiplayerEvent 콜백 이벤트의 배열을 제공합니다.

상태 시스템

상태를 최신 상태로 유지하려면 XblMultiplayerManagerDoWork 호출이 필요합니다. 멀티 플레이어 관리자가 작업을 수행하려면 XblMultiplayerManagerDoWork 메서드를 정기적으로 호출해야 합니다. 이를 수행하는 가장 안정적인 방법은 프레임당 최소 한 번 이상 호출하는 것입니다.

XblMultiplayerManagerDoWork는 할 일이 없을 때 빠르게 반환되므로 너무 자주 호출할 염려가 없습니다.

스레딩

멀티 플레이어 관리자 API에서 반환된 모든 개체는 스레드로부터 안전한 것으로 간주되어서는 안 됩니다. 그러나 여러 스레드에서 호출하는 경우 스레드 동기화를 수행하도록 제어할 수 있습니다.

라이브러리에는 내부 다중 스레딩 보호 기능이 있습니다. 그러나 하나의 스레드가 값에 액세스해야 하는 경우에는 여전히 자체 잠금을 구현해야 합니다. 예를 들어 다른 스레드가 XblMultiplayerManagerDoWork를 호출하는 동안 구성원 목록을 탐색할 수 있습니다.

상태 기반 모델 업데이트

멀티 플레이어 관리자는 플레이어가 참가하거나 나갈 때 또는 세션이 업데이트될 때 백그라운드에서 세션을 업데이트하는 상태 기반 모델을 유지 관리합니다. UI 스레드와 게임 스레드 간의 스레드 동기화 문제를 방지하기 위해 멀티 플레이어 관리자는 XblMultiplayerManagerDoWork 메서드를 호출할 때까지 세션의 앱 표시 상태를 업데이트하지 않습니다.

일반적으로 백그라운드 스레드에서 세션 변경과 같은 이벤트에 대한 알림을 받은 다음 이러한 변경을 표시하려면 UI 스레드와 동기화해야 합니다. 멀티 플레이어 관리자를 사용하면 이 비하인드 스토리가 자동으로 완료됩니다.

멀티 플레이어 관리자가 백그라운드에서 버퍼링하는 상태의 최신 스냅샷을 얻기 위해 선택한 시점에 기본 스레드에서 XblMultiplayerManagerDoWork를 호출할 수 있습니다.

이벤트 및 알림

멀티 플레이어 관리자는 중요한 이벤트(XblMultiplayerEvent를 참고) 집합을 정의하고, 이벤트가 발생할 시XbMultiplayerManagerDoWork 메서드를 통해 타이틀에 알립니다. 예를 들어 이벤트에는 원격 플레이어 참가 또는 나가기, 멤버 속성 변경 또는 세션 상태 변경이 포함됩니다.

모든 멀티 플레이어 관리자 API는 비동기식입니다. XblMultiplayerManagerDoWork메서드는 이 비동기 작업이 완료되면 이벤트 목록을 반환합니다. 타이틀은 상황에 맞게 이러한 이벤트를 처리해야 합니다. 자세한 내용은 XblMultiplayerEvent 클래스 문서를 참조하세요.

반환된 각 XblMultiplayerEvent에는 이벤트 유형에 적절한 args을(를) 가져오는 데 사용해야 하는 EventArgsHandle이(가) 포함됩니다. 예를 들어, XblMultiplayerEventTypeMemberJoined이면 XblMultiplayerEventArgsMembersCountXblMultiplayerEventArgsMembers를 호출할 수 있습니다.

다음 예는 XblMultiplayerManagerDoWork를 사용하여 이벤트를 처리하는 방법을 보여줍니다.

플랫 C API

size_t eventCount{ 0 };
const XblMultiplayerEvent* events{ nullptr };
HRESULT hr = XblMultiplayerManagerDoWork(&events, &eventCount);
if (FAILED(hr))
{
    // Handle failure.
}

for (auto i = 0u; i < eventCount; ++i)
{
    switch (events[i].EventType)
    {
        case XblMultiplayerEventType::MemberJoined:
        {
            // Handle MemberJoined.
            size_t memberCount = 0;
            hr = XblMultiplayerEventArgsMembersCount(events[i].EventArgsHandle, &memberCount);
            assert(SUCCEEDED(hr));

            std::vector<XblMultiplayerManagerMember> members(memberCount);
            hr = XblMultiplayerEventArgsMembers(events[i].EventArgsHandle, memberCount, members.data());
            assert(SUCCEEDED(hr));
            ...

            break;
        }

        case XblMultiplayerEventType::SessionPropertyChanged:
        {
            // Handle SessionPropertyChanged.
            const char* changedProperty{ nullptr };
            hr = XblMultiplayerEventArgsPropertiesJson(events[i].EventArgsHandle, &changedProperty);
            assert(SUCCEEDED(hr));
            ...

            break;
        }
        ...
    }
}

자세한 내용은 다음을 참조하세요.

시나리오

이 섹션에서는 일반적인 시나리오와 각 시나리오에서 호출할 API를 다룹니다. 멀티 플레이어 관리자가 배후에서 수행하는 작업에 대한 일부 정보도 제공됩니다.

API에 대한 개괄적인 개요는 멀티 플레이어 관리자 API 개요를 참조하세요.

멀티 플레이어 관리자가 하지 않는 것

멀티 플레이어 관리자를 사용하면 멀티 플레이어 시나리오를 훨씬 쉽게 구현하고 일부 데이터를 추상화할 수 있습니다. 그러나 멀티 플레이어 관리자는 다음을 처리하지 않습니다.

  • MMO(Massively Multiplayer Online) 게임 또는 대규모 세션(한 세션에 100명 이상의 플레이어)이 필요한 기타 게임 유형과 같은 지속적인 온라인 서버 게임
  • 서버 간 세션 관리
  • Fine-Grained Rate Limiting 준수를 위한 MPSD 호출 제한
  • Multiplayer 서비스 API와 멀티 플레이어 관리자 API 혼합

참고 항목

멀티 플레이어 관리자는 특정 네트워크 기술로 제한되지 않으며 모든 네트워크 통신 계층에서 작동해야 합니다.

리소스

API의 작동 예는 NetRumble 샘플을 참조하세요.

API 문서는 multiplayer_manager_c를 참조하세요. multiplayer_manager_c.h 헤더 파일을 볼 수도 있습니다.

멀티 플레이어 관리자 사용에 대한 질문, 피드백 또는 문제가 있는 경우 개발자 계정 관리자(DAM)에게 문의하거나 https://forums.xboxlive.com의 포럼에 지원 스레드를 게시하세요.