XBOX Game Development Kit(GDK)에는 API 싱글턴이 없음
Steamworks는 각 API 기능 세트가 인터페이스로 정의되는 패턴을 따릅니다(예: 모든 사용자 통계 함수는ISteamUserStats 인터페이스에 있고, 원격 저장소는 ISteamRemoteStorage에 있음). 게임 코드에서 API가 초기화되는 즉시 그 인스턴스들이 사용 가능해집니다. 게임 시작 시 초기화되는 Steamworks API 싱글턴은 이러한 함수를 제공하고 애플리케이션의 수명 동안 상태를 추적합니다.
XBOX Game Development Kit(GDK) API에서는 그렇지 않으며, 게임이 스스로 API 데이터의 컨텍스트와 현재 상태 대부분을 유지하고 다양한 API 함수에 전달해야 하는 C API를 선호합니다. 예를 들어, XBOX 서비스로 사용자를 인증한 후 게임은 XBOX 서비스 컨텍스트 핸들과 사용자 핸들을 유지해야 합니다. 이 정보를 얻는 데 사용되는 API는 Steamworks가 하는 것처럼 게임의 수명 동안 “기억”하지 않습니다. 따라서 게임 클래스에 멤버 변수를 추가하거나 다른 방식으로 게임 내에서 이러한 핸들을 추적해야 합니다.
비동기 함수와 콜백
Steamworks의 비동기 함수는STEAM_CALLBACK 매크로 또는 CCallResult 변수로 구독할 수 있는 이벤트를 트리거합니다. 지정된 이벤트 구조체 유형에 해당하는 이벤트가 발생하면 지정된 메서드가 호출되고 이벤트 구조체가 유일한 인수로 제공됩니다. 이 구조체는 API가 반환한 결과와 호출 결과를 처리하는 데 필요할 수 있는 이전에 사용 가능한 컨텍스트 정보를 포함합니다. 예를 들어 ISteamUserStats::DownloadLeaderboardEntries를 호출할 때 콜백 함수에서 ISteamUserStats::DownloadLeaderboardEntries에 전달할 SteamLeaderboard_t 핸들이 필요하며, 이는 정의한 콜백 메서드에 매개변수로 전달되는 LeaderboardScoresDownloaded_t 구조체의 멤버로 얻을 수 있습니다.
XBOX Game Development Kit(GDK)에서 모든 비동기 액션은 다른 패턴을 따릅니다: XAsyncBlock 구조체를 생성하고, 선택적으로 태스크 큐에 할당한 다음, 비동기 API 메서드를 호출합니다. 그 API 호출이 완료된 후 XAsyncBlock의 멤버로 정의된 콜백 함수를 실행하며, 비동기 블록에 대한 포인터를 유일한 인수로 제공합니다. 콜백 함수 내부에서 정보에 접근해야 한다면 비동기 블록의 context 포인터 멤버를 사용할 수 있습니다. Steam과 달리, 이 context 구조체의 정보는 자동으로 제공되지 않으며 직접 구성해야 합니다. 이전 예시를 사용해 콜백 함수에서 데이터 집합에 접근해야 한다면 이 코드 예시처럼 다음을 수행할 수 있습니다.
위 예시는 콜백 함수가 필요할 경우 인스턴스 메서드를 호출하거나 멤버 변수에 접근할 수 있도록
shared_from_this()를 통해 this에 대한 포인터도 포함합니다. 수명 문제 때문에 raw 포인터를 전달할 때는 매우 조심하세요. 또한 콜백에서 하나의 변수에만 접근하면 되는 경우, 비동기 블록의 context 포인터 값을 그 값에 대한 포인터로 설정하고 콜백에서 그 값 유형으로 캐스팅하기만 하면 구조체를 정의할 필요가 없습니다.SteamAPI_RunCallbacks 함수를 사용해 일정 간격으로 콜백을 트리거해야 합니다. XBOX Game Development Kit(GDK)에서는 이것이 필요하지 않습니다. 기본값인 스레드 풀 태스크 큐를 사용하는 경우, 그 태스크 큐에 의해 디스패치된 비동기 태스크가 완료된 후 콜백이 트리거됩니다.
더 많은 제어를 위해 수동 태스크 큐를 사용할 때 XTaskQueueDispatch를 호출해 비동기 태스크를 특정 스레드로 수동 디스패치할 수 있습니다. 이는 더 복잡하며 이 방법에 대한 세부 정보는 이 가이드의 범위를 벗어납니다. XBOX Game Development Kit(GDK)이 비동기 API 작업을 처리하는 방식에 대한 자세한 내용과 코드 샘플은 비동기 프로그래밍 모델을 참조하세요.
타이틀 관리 API의 원본 소스
Steamworks에서 API는 그것을 사용하는 거의 모든 값의 유일한 원본 소스입니다. 예를 들어 사용자 통계는 API에서 가져와ISteamUserStats::GetStat/ISteamUserStats::SetStat의 값에 따라 계산되며, 다른 곳에 이 값을 스스로 저장할 필요가 없습니다.
XBOX Game Development Kit(GDK)의 업적 및 통계/리더보드 API는 개발자가 호출에 있어 더 많은 유연성과 단순성을 원할 때 타이틀 관리(title-managed)로 사용할 수 있는 옵션이 있습니다. 이름에서 알 수 있듯이 타이틀 관리 API의 값은 여러분의 타이틀이 관리합니다. 이 값의 유일한 원본 소스는 여러분의 게임이며, 세이브 파일, 클라우드 저장소, 서드파티 백엔드 서버 등 어디에든 값을 저장할 수 있습니다. XBOX 네트워크(XBOX Live로도 알려짐) 서버에 저장된 값은 가끔 업데이트하는 스냅샷으로 사용할 수 있지만, 런타임에 유일한 원본 소스여서는 안 됩니다.
타이틀 관리 통계/업적의 대안은 이벤트 기반 통계/업적입니다. 이는 사용자의 업적 진행을 업데이트하거나 통계를 다시 계산하기 위해 텔레메트리 이벤트를 사용하며, XBOX 서비스를 원본 소스로 간주합니다. Partner Center의 게임에 대한 Gameplay Setting 페이지에서 통계와 업적에 사용할 API를 선택할 수 있습니다.
자세한 내용은 이벤트 기반 vs. 타이틀 관리 통계와 이벤트 기반 vs. 타이틀 관리 업적을 비교하는 항목의 설명을 참조하세요. 이 API는 이전 이름인 Stats/Achievements 2013(이벤트 기반) 및 Stats/Achievements 2017(타이틀 관리) 로 참조되는 경우도 있습니다.
XBOX Game Development Kit(GDK)는 멀티플랫폼
Steamworks API를 사용하는 게임은 항상 Steam을 통해 실행된다고 가정할 수 있으므로, API가 초기화 시 누가 게임을 플레이하는지에 대한 일부 컨텍스트를 주입할 수 있습니다. XBOX Game Development Kit(GDK)를 사용하는 게임은 XBOX 콘솔에서 실행되거나, PC에서 XBOX Gaming App을 통해 실행되거나, 다양한 기기와 런처에서 실행될 수 있습니다. 따라서 Steam에서 자동으로 사용 가능한 일부 컨텍스트는 사용자 신원과 같이 XBOX Game Development Kit(GDK)에서 수동으로 초기화해야 할 수 있습니다. 이 정보에 접근하려면 이 가이드의 GDK 초기화 항목의 단계를 따르세요. 이 항목은 Microsoft 계정/게이머태그로 사용자를 인증하는 지침을 제공합니다. 이는 또한 XBOX Game Development Kit(GDK)의 함수에 PC에는 없는 콘솔 시나리오에 맞춰진 일부 패러다임이 있음을 의미합니다(예:XUser API의 다중 사용자 로그인 지원).
패키징
Steam의 대부분의 게임은 단순히 Steamworks 관리 포털에서 게임 정보를 설정하고 SDK를 다운로드하고 필요한 파일을 임포트한 다음 코드에서 API를 초기화함으로써 Steamworks API 함수를 사용할 수 있습니다. 이러한 단계를 완료한 후 게임은 게임 엔진 에디터와 같이 실행되는 어디에서든 Steamworks API와 통합됩니다. XBOX Game Development Kit(GDK) API가 동작하려면 게임을 먼저 패키징해야 합니다. 게임을 올바르게 패키징하려면 게임의MicrosoftGame.config 파일을 편집하고 XBOX Game Development Kit(GDK)의 MakePkg 도구를 사용해 게임의 MSIXVC 패키지를 생성해야 하며, 이를 Developer Mode가 활성화된 PC에서 Microsoft Store 앱으로 사이드로드할 수 있습니다.
이는 또한 Steamworks 게임과 달리 XBOX Game Development Kit(GDK) 기능 중 일부는 게임을 먼저 패키징하지 않고서는 게임 엔진 에디터나 다른 개발 시점 환경에서 동작하지 않음을 의미합니다.
패키징에 대한 자세한 내용은 다음 자료를 참조하세요.
