다음을 통해 공유


Microsoft 게임 개발 키트와 Steamworks의 개념적 차이점

Steamworks와 Microsoft GDK(게임 개발 키트)에는 구조, API의 패턴 및 용도에 몇 가지 차이가 있습니다. 이 문서에 설명되어 있습니다.

GDK에는 API singleton이 없습니다.

Steamworks는 각 API 기능 집합이 인터페이스로 정의된 패턴을 따릅니다(예: 모든 사용자 통계 함수는 인터페이스에 ISteamUserStats 있고 원격 스토리지는 에 있음 ISteamRemoteStorage). 해당 인스턴스는 코드에서 게임에 의해 API가 초기화되는 즉시 사용할 수 있습니다. 게임이 시작될 때 초기화되는 Steamworks API 싱글톤은 이러한 기능을 제공하고 게임 수명 동안 상태를 추적합니다.

GDK API의 경우는 그렇지 않습니다. 여기에는 API 데이터의 컨텍스트 및 현재 상태 대부분을 게임 자체에서 유지하고 다양한 API 함수로 전달해야 하는 C API가 있습니다. 예를 들어, Xbox 서비스로 사용자를 인증한 후에 게임은 Xbox 서비스 컨텍스트 핸들과 사용자 핸들을 유지해야 합니다. 이 정보를 가져오는 데 사용되는 API는 Steamworks와 같은 게임의 수명 동안 유지되지 않습니다. 게임 클래스에 멤버 변수를 추가하거나 게임에서 이러한 핸들을 추적해야 합니다.

비동기 함수 및 콜백

Steamworks의 비동기 함수는 STEAM_CALLBACK 매크로나 CCallResult 변수를 사용하여 구독할 수 있는 이벤트를 트리거합니다. 지정된 이벤트 구조체 형식에 해당하는 이벤트가 발생하면 지정된 메서드가 호출되고 이벤트 구조체가 유일한 인수로 제공됩니다. 이 구조체에는 호출 결과를 처리하는 데 필요할 수 있는 API 및 이전에 사용 가능한 컨텍스트 정보가 반환된 결과가 포함됩니다. 예를 들어 를 호출 ISteamUserStats::DownloadLeaderboardEntries하려면 콜백 함수의 핸들이 에 전달되어야 합니다 SteamLeaderboard_tISteamUserStats::DownloadLeaderboardEntries. 정의한 콜백 메서드에 LeaderboardScoresDownloaded_t 매개 변수로 전달된 구조체의 멤버로 가져올 수 있습니다.

GDK에서 모든 비동기 작업은 다른 패턴을 따릅니다. 구조체를 XAsyncBlock 만들고 필요에 따라 작업 큐에 할당한 다음 비동기 API 메서드를 호출합니다. API 호출이 완료되면 의 멤버 XAsyncBlock 로 정의된 콜백 함수를 실행하고 비동기 블록에 대한 포인터를 유일한 인수로 제공합니다. 콜백 함수 내의 정보에 액세스해야 하는 경우 비동기 블록의 컨텍스트 포인터 멤버를 사용할 수 있습니다. Steam과 달리 이 컨텍스트 구조체의 정보는 자동으로 제공되지 않으므로 직접 빌드해야 합니다. 이전 예제를 사용하여 콜백 함수의 데이터 집합에 액세스해야 하는 경우 이 코드 예제와 같이 다음을 수행할 수 있습니다.

MyClass::SimpleContextExample()
{
    // ...
    struct MyContext 
    {
        MyHandle_t handle;
        std::shared_ptr<MyClass> instance;
    }

    // Assume myHandle is a variable containing the handle you'll need in your call function.
    auto contextPtr = std::unique_ptr<MyContext>(new MyContext{ myHandle, shared_from_this() });
    XAsyncBlock async = std::make_unique<XAsyncBlock>();
    async->context = contextPtr.get(); 
    async->callback = [](XAsyncBlock *async)
    {
        std::unique_ptr<XAsyncBlock> asyncBlockPtr{ asyncBlock }; // Take over ownership of the XAsyncBlock*.        
        std::unique_ptr<MyContext> contextPtr{ static_cast<MyContext*>(asyncBlock->context) }; // Take over ownership of the context.        

        auto handle = contextPtr->handle;
        // You can now use your handle for other API calls.
    };

    HRESULT hr = SomeAsyncFunction(arg1, arg2, asyncBlock.get());
    if (SUCCEEDED(hr))
    {
        // The call succeeded, so release the std::unique_ptr ownership of XAsyncBlock* and context* 
        // because the callback will take over ownership.
        // If the call fails, the std::unique_ptr will keep ownership and delete the XAsyncBlock* and context block.
        asyncBlock.release();
        contextPtr.release();
    }
}

참고 항목

이전 예제에는 콜백 함수가 instance 메서드를 this 호출하거나 필요한 경우 멤버 변수에 액세스할 수 있도록 을 통해 shared_from_this() 에 대한 포인터도 포함되어 있습니다. 수명 문제로 인해 원시 포인터를 전달할 때는 주의해야 합니다. 또한 콜백에서 하나의 변수에만 액세스해야 하는 경우 비동기 블록 포인터의 context 값을 해당 값에 대한 포인터로 설정한 다음 구조체를 정의할 필요 없이 콜백에서 해당 값의 형식으로 캐스팅할 수 있습니다.

Steamworks에서는 또한 게임의 코드에서 SteamAPI_RunCallbacks 함수를 사용하여 일정 간격으로 콜백을 실행해야 합니다. GDK에서는 필요하지 않습니다. 콜백은 기본값인 스레드 풀 작업 큐를 사용하는 경우 작업 큐에서 디스패치되는 비동기 작업이 완료된 후에 트리거됩니다.

더 많은 제어를 위해 수동 작업 큐를 사용할 때 를 호출 XTaskQueueDispatch 하여 비동기 작업을 특정 스레드로 수동으로 디스패치할 수 있습니다. 이것은 더 복잡합니다. 이 작업을 수행하는 방법에 대한 세부 정보는 이 가이드의 scope 외부에 있습니다. GDK가 코드 샘플을 포함하여 비동기 API 작업을 처리하는 방법에 대한 자세한 내용은 비동기 프로그래밍 모델을 참조하세요.

타이틀 관리 API에 관한 단일 소스

Steamworks를 사용하면 API는 거의 모든 값에 영향을 주는 단일 소스입니다. 예를 들어 사용자 통계는 API에서 가져오고 의 값을 ISteamUserStats::GetStat/ISteamUserStats::SetStat기반으로 계산됩니다. 이러한 값을 다른 곳에 저장할 필요는 없습니다.

GDK의 도전 과제 및 통계/순위표 API에는 필요한 호출에서 더 많은 유연성과 단순성을 원하는 개발자를 위해 타이틀 관리 옵션이 있습니다. 타이틀 관리 API의 값은 이름에서 알 수 있듯이 타이틀에 의해 관리됩니다. 이러한 값에 대한 단일 진리 소스는 어디서나 값을 저장할 수 있는 게임입니다. 예를 들어 저장 파일, 클라우드 스토리지 또는 타사 백 엔드 서버가 있습니다. Xbox 네트워크(이전의 Xbox Live) 서버에 저장된 값은 때때로 업데이트하는 스냅샷 사용할 수 있지만 런타임에 단일 원본이 되어서는 안 됩니다.

게임 출시 방법

Steamworks API를 사용하는 게임은 항상 Steam을 통해 시작된다고 가정할 수 있습니다. API는 게임을 플레이하는 사용자에 대한 초기화 시 몇 가지 컨텍스트를 삽입할 수 있습니다. GDK는 Xbox 콘솔, PC에서 Xbox 게임 앱을 사용하거나 여러 장치 및 시작 관리자에서 실행되는 게임에서 사용할 수 있습니다.

Steam에서 자동으로 사용할 수 있는 일부 컨텍스트는 사용자의 ID와 같이 GDK를 사용하여 수동으로 초기화해야 할 수 있습니다. 이 정보에 액세스하려면 Microsoft 게임 개발 키트 초기화 문서의 단계를 사용합니다. Microsoft 계정/게이머태그를 사용하여 사용자를 인증하기 위한 지침이 있습니다. GDK 함수의 일부 패러다임은 API에 대한 XUser 여러 사용자 로그인 지원과 같이 PC에 아날로그가 없는 콘솔 시나리오에 맞게 조정됩니다.

패키징

Steam의 대부분의 게임은 Steamworks 관리 포털에서 게임 정보를 설정하고, SDK를 다운로드하고, 필요한 파일을 가져오고, 코드에서 API를 초기화하여 Steamworks API 함수를 사용할 수 있습니다. 그런 다음 게임은 게임 엔진 편집기 등 출시된 모든 곳에서 Steamworks API와 통합됩니다. 패키징은 필요하지 않습니다.

GDK의 API가 작동하려면 먼저 게임을 패키지해야 합니다. 이를 통해 일부 GDK 기능은 게임 엔진 편집기 또는 기타 개발 시간 환경에서 작동할 수 있습니다. 게임을 올바르게 패키지하려면 파일을 편집 MicrosoftGame.config 하고 GDK 도구를 사용하여 MakePkg 게임에 대한 MSIXVC 패키지를 만듭니다. 그런 다음 개발자 모드를 사용하도록 설정된 PC에서 이 패키지를 Microsoft Store 앱으로 테스트용으로 로드할 수 있습니다.

패키징에 대한 자세한 내용은 다음 문서를 참조하세요.

샌드박스

GDK 게임은 시험판 테스트에 샌드박스를 사용합니다. 샌드박스는 게임 개발 중에 다양한 기능을 테스트하는 데 유용하고 격리된 환경입니다. 이 작업은 사용자가 보는 소매 환경을 포함하여 다른 환경에 이러한 기능을 노출하지 않고 수행할 수 있습니다. 파트너 센터에서 샌드박스를 만든 다음 Xbox 서비스 PC 샌드박스 전환기(XblPCSandbox.exe)를 사용하여 개발 PC에 있는 샌드박스를 변경할 수 있습니다. 각 샌드박스에는 다양한 성과, 통계, 순위표, 정보가 할당되어 있어 다른 샌드박스에 영향을 미치지 않습니다. 자세한 내용은 Xbox 서비스 샌드박스 개요를 참조하세요.