다음을 통해 공유


게임 저장

XGameSave API를 사용하면 게임이 인터넷에 연결될 때마다 클라우드와 동기화되는 로컬 저장소에 게임 데이터를 저장할 수 있습니다. 저장된 데이터는 동기화 후 다른 모든 연결된 장치에서 사용할 수 있습니다. 유지되는 데이터의 정확한 세분성은 각 게임에 따라 다릅니다. 개발자는 최상의 계속하기 환경이 되도록 가능한 한 정확하게 게임 상태를 저장하는 것이 좋습니다.

모놀리식 저장을 기록하는 대신 독립적으로 업데이트할 수 있는 논리적 그룹화로 게임 저장 데이터를 나눠야 합니다. 이렇게 하면 게임이 다양한 상황에서 기록하는 데이터 양이 감소해 로컬 리소스 사용량과 다른 IO 사용을 줄일 수 있습니다. 또한 API를 사용하면 타이틀에서 두 개 이상의 데이터 항목을 원자성 작업으로 업데이트할 수 있습니다. 이 작업은 완전하게 성공하거나 (저장 중 치명적 오류처럼) 아예 실행되지 않습니다.

Xbox One에서는 사용자가 타이틀 간에 빠르게 전환할 수 있기 때문에 개발자는 일시 중단Suspend 이벤트가 수신되는 상황을 예상해 현재 상태가 언제든 저장할 수 있는 상태가 유지되도록 게임을 설계해야 합니다. XGameSave API는 짧은 일시 중단 기간 동안 쓰기 타이틀 쓰기 속도를 극대화하기 위해 최초 저장 지점으로 타이틀 예약 외부의 RAM을 사용합니다. 그러면 시스템에서 데이터를 지속성 저장소에 내구성 저장소에 유지하고 마지막 업로드 이후 다른 데이터 쓰기와 조정하고 데이터 업로드를 예약합니다. 저장한 후 업로드 대기 상태가 되면 시스템이 네트워크 연결 손실이나 전원 오류 같은 다양한 오류에 강력하게 대응합니다.

XGameSave API

XGameSave API는 다음과 같은 기능을 제공합니다.

  • TitleID/SCID(service configuration identifier)별 사용자당 총 256MB의 저장소 공간을 제공합니다.
  • 전원 오류가 발생할 경우 처리를 제공합니다.
  • 데이터가 자동으로 클라우드와 동기화됩니다.
  • 클라우드 지원 데이터는 Xbox One 장치 전체에서 사용할 수 있습니다.
  • 플랫폼이 타이틀과 별도로 장치 간 동기화 및 충돌 관리를 처리합니다.
  • XGameSaveSubmitUpdate(또는 XGameSaveSubmitUpdateAsync) 호출 당 업로드할 수 있는 데이터 양은 16MB로 제한됩니다.

게임이 사용자의 저장 한도에 도달하면 XGameSaveSubmitUpdateXGameSaveSubmitUpdateAsync 호출이 실패합니다. 사용 가능한 할당량을 알고 싶은 게임의 경우 XGameSaveGetRemainingQuota 또는 XGameSaveGetRemainingQuotaAsync 중 하나를 호출할 수 있습니다.

XGameSave API는 개발자의 기본 프로그래밍 모델에 따라 비동기 및 동기 (차단) 호출을 모두 지원합니다. 이 API는 IO 기반이기 때문에 일부 호출은 실행하는 데 약간의 시간이 걸릴 수 있습니다. 중요한 게임 엔진 스레드의 동기 API는 호출하지 마세요. XThreadSetTimeSensitive를 호출하여 중요한 게임 엔진 스레드를 표시하는 것을 고려하세요.

XGameSave를 위한 게임 구성

XGameSave API를 사용하는 경우 모든 읽기 및 쓰기 작업이 Xbox 서비스 기본 SCID(서비스 구성 ID)와 연결됩니다. 지정된 게임에는 자체 ID가 있는 서비스 구성이 여럿 있을 수 있습니다. SCID는 XGameSave API를 초기화하는 데 사용되며 XGameSaveInitializeProviderAsync로 전달되어야 합니다. XGameSave API를 사용하여 다른 작업을 수행하려면 먼저 공급자를 초기화해야 합니다.

타이틀 간 게임 저장

한 타이틀에서 다른 타이틀로 데이터를 전송하거나 액세스하려면 두 단계가 필요합니다.

  1. 파트너 센터에서 액세스하려는 타이틀의 액세스 정책을 수정합니다.
  2. 소스 코드에서 XGameSave 두 타이틀 모두에 대한 공급자를 초기화합니다.

액세스 정책 수정

타이틀은 액세스 정책을 구성하여 데이터에 액세스할 수 있는 타이틀을 제어할 XGameSave 수 있습니다.

  1. 파트너 센터로 이동합니다.
  2. 앱 및 게임> *타이틀* >게임 플레이 설정을 선택합니다.
  3. 게임 플레이 설정에서 액세스 정책을 선택한 다음 연결된 스토리지를 확장합니다.
  4. 앱/서비스 추가를 선택한 다음, 액세스를 제공하려는 타이틀을 추가합니다.
  5. 제목 추가를 완료한 후 저장을 선택한 다음 게시를 선택합니다. 변경 내용은 1시간 이내에 적용됩니다.

다음 스크린샷은 "GameSaveFilesCombo" 타이틀이 "GameSaveSample" 타이틀에 완전히 액세스할 수 있도록 하는 예제입니다.

파트너 센터 액세스 정책 UI의 스크린샷

XGameSave 공급자 초기화

이제 첫 번째 타이틀에 액세스할 수 있는 권한이 있으므로 다른 타이틀 XGameSave 에서 데이터를 읽을 수 있습니다.

XGameSave 개념

API과 관련해 다음과 같이 몇 가지 유용한 개념이 있습니다.

  • 저장소 공간은 사용자의 모든 저장 데이터를 나타냅니다. 기본 설정으로 이것은 사용자 TitleID/SCID당 256MB로 제한됩니다.
  • 저장소 공간여러 저장소 컨테이너로 구성될 수 있습니다. 각 저장소 컨테이너는 사용자 또는 게임에 적합할 수 있는 다른 논리 블록에 대한 게임 저장을 나타낼 수 있습니다. 각 저장소 컨테이너에는 이름이 있습니다.
  • 저장소 blob: 각 저장소 컨테이너는 blob으로 구성됩니다. 각 blob에는 이름이 있습니다. Blob은 지정된 저장소 컨테이너를 구성하는 데이터입니다.

XGameSave 저장소 공간

높은 수준에서 XGameSave 시스템에 있는 모든 데이터는 사용자 또는 시스템(예: 개별 Xbox One 본체)과 연결됩니다. 특정한 사용자나 시스템을 위해 앱이 저장한 모든 데이터는 XGameSave 저장소 공간에 저장됩니다.

각 게임 사용자가 받는 XGameSave 저장소 공간은 총 256MB로 제한됩니다. 이 저장소는 게임 전용 전용임에 유의해야 합니다. 다른 게임과 공유 되지 않습니다.

저장소 공간을 획득하려면 XGameSaveInitializeProvider 또는 XGameSaveInitializeProviderAsync를 호출합니다. XUserHandle을 전달하면 공급자는 자동으로 해당 사용자의 저장소 공간을 가져오고 동기화합니다. 공간 내부의 모든 컨테이너가 동기화됩니다. 그러므로 이 메서드는 특히 사용자가 하나의 장치에 데이터를 저장한 후에 다른 장치에서 처음으로 게임 플레이를 계속하는 경우에 장기 실행 작업이 될 수도 있습니다. 이 작업이 완료된 이후로는 저장소 공간과 상호 작용을 완료하기 위해 클라우드의 응답이 필요하지 않습니다.

공급자를 초기화할 때 게임은 "주문형 동기화"를 사용하도록 선택할 수 있습니다. 이 옵션을 사용하는 경우 초기 동기화는 클라우드에서 컨테이너에 대한 필수 메타데이터만 다운로드합니다. 이 작업은 신속하며, 네트워크 상태가 양호할 경우 사용자에게 대기 화면이 표시되지 않습니다. 전체 다운로드는 실제로 컨테이너에 액세스(즉 하나 이상의 blob을 읽거나 blob 쿼리를 수행)할 때만 발생합니다.

필요 시 동기화할지 또는 한 번에 동기화할지에 대한 결정은 개발자의 몫입니다. 게임에서 저장되는 데이터의 양이 적거나 모든 데이터가 동기화되는 단일 지점만 원하는 경우 "주문형 동기화"를 사용하지 않는 것이 좋습니다. 그러나 게임에서 특히 많은 양의 저장을 사용하고 사용자가 게임을 플레이하는 데 모든 저장 데이터가 필요하지 않은 경우 "주문형 동기화"를 사용하면 필요할 때만 데이터를 가져와서 사용자 환경을 크게 개선할 수 있습니다.

참고 항목

"주문형 동기화"를 사용할 때 동기화가 필요한 컨테이너의 각 액세스 시 현재 장치에 있는 콘텐츠가 클라우드에 있을 수 있는 내용과 충돌하는 경우 "동기화 진행" 또는 "충돌" 대화 상자와 같은 다양한 대화 상자가 사용자에게 표시될 수 있습니다.

자세한 내용은 필요 시 동기화(NDA 항목)권한 부여 필요 개요를 참조하세요.

XGameSave 컨테이너와 Blob

XGameSave 저장소 컨테이너 또는 약어로 컨테이너는 저장소의 기본 단위입니다. 각 XGameSave 저장소 공간에는 다수의 컨테이너가 포함될 수도 있습니다.

데이터가 blob라는 하나 이상의 버퍼로 컨테이너에 저장됩니다. 컨테이너마다 컨테이너에 있는 각 blob의 데이터 파일에 대한 참조를 포함하는 컨테이너 파일이 있습니다.

이 API의 저장소 부분은 게임 데이터를 영구 저장소로 안전하고, 신뢰할 수 있는 트랜잭션 방식으로 쉽게 전송할 수 있도록 디자인되었습니다. 컨테이너의 지원 데이터를 항상 일관된 상태로 유지하여 전체 작업이 하나의 단위로 성공하거나 실패하도록 해야 합니다. 따라서 전체 작업이 원자 수준에서 성공하거나 실패해야 합니다. 일부 Blob 데이터가 컨테이너에 있는 다른 데이터와 일치하지 않는 부분 업데이트는 필요하지 않습니다. 이를 위해 blob 쓰기 및 삭제가 제출되는 업데이트 컨텍스트가 제공됩니다. 준비가 되면 전체 컨텍스트가 제출됩니다.

컨테이너 업데이트를 시작하려면 먼저 게임에서 XGameSaveCreateContainer를 호출하여 컨테이너 핸들을 가져와야 합니다. 그런 다음 게임에서 XGameSaveCreateUpdate를 호출해야 업데이트 컨텍스트를 얻을 수 있습니다. 업데이트 컨텍스트가 있으면 게임은 XGameSaveSubmitBlobWrite 또는 XGameSaveSubmitBlobDelete를 호출할 수 있습니다. 게임은 변경 내용 일괄 처리를 제출할 준비가 되면 XGameSaveSubmitUpdate 또는 XGameSaveSubmitUpdateAsync를 호출합니다. 업데이트에 설명된 모든 변경 내용 전체가 적용됩니다. 요청대로 모든 blob이 업데이트되거나 전체 작업이 취소되고 컨테이너는 업데이트가 시작되기 전 상태를 유지합니다. 각 업데이트에서 데이터는 최대 16MB로 제한됩니다.

참고 항목

XGameSave API를 사용하려면 TitleID와 SCID가 올바르게 구성되어 있어야 합니다. 이러한 필수 ID에 대한 자세한 내용은 샌드박스 설정을 참조하세요. 게임이 파트너 센터에서 Xbox 서비스에 대해 활성화되어 있어야 합니다.

SCID 및 타이틀 ID를 올바르게 구성하지 않으면 XSaveGame API 호출이 실패하고 다음 오류 코드가 표시됩니다.

E_GS_NO_ACCESS - 0x80830002 - 타이틀에 컨테이너 저장소 공간에 대한 액세스 권한이 없기 때문에 작업이 실패했습니다.

참고 항목

XGameSave