다음을 통해 공유


XGameSave 모범 사례

이 항목에서는 XGameSave API를 사용하는 방법에 대한 몇 가지 모범 사례를 설명합니다.

저장소 공간을 얻는 시기

일반적으로 사용자가 로그인하고 게임을 플레이하고자 하는 의사를 나타낸 후에 게임이 XGameSave 저장소 공간 확보를 시도해야 합니다. 게임은 XGameSaveInitalizeProvider 또는 XGameSaveInitalizeProviderAsync를 호출하여 저장소 공간을 획득합니다.

사용자의 연결된 저장소 공간을 획득하기 위한 실행 시간은 다를 수 있습니다. 게임은 사용자의 로그아웃 시작 또는 시스템에서 보낸 일시 중단 알림 수신에 대응하기 위해서가 아니라 기본 실행 중에 이 작업을 수행해야 합니다. 또한 작업을 동시에 실행할 수 있도록 긴 데이터 로드 순서에 맞춰 연결된 저장소 공간을 획득하는 방법도 고려해야 합니다.

게임에서 XGameSave 저장소 공간에 대한 액세스 권한을 요청하면 시스템이 사용자의 저장된 데이터를 Xbox One 본체 간에 일관된 상태로 유지하고 사용자의 데이터를 오프라인 플레이에서도 사용할 수 있도록 하기 위해 동기화 프로세스를 수행합니다. 동기화에 걸리는 시간이 저마다 다르고 사용자가 결정을 해야 할 수도 있기 때문에 시스템에서는 프로세스의 여러 단계에서 사용자에게 UI를 표시할 수 있습니다.

사용자는 동기화 UI가 활성 상태이더라도 언제든지 Xbox 버튼을 눌러 앱에서 벗어날 수 있습니다. 시스템이 UI를 숨기고, 사용자 상호 작용 없이 최대한 길게 동기화가 계속됩니다. 사용자가 앱에 돌아오면 동기화가 완료되지 않은 한 UI가 다시 표시됩니다. UI가 숨겨져 있을 때 시스템은 사용자 선택에 대해 가정을 하지 않습니다.

저장소 공간의 수명

일반적으로 게임은 특정 저장소 공간에 대해 XGameSaveProviderHandle을 확보한 후에 게임 세션 기간만큼 해당 핸들을 보유합니다. 핸들을 계속 유지해도 게임에 부정적인 영향은 없습니다. 핸들을 릴리스했다가 다시 얻으려고 하면 시간이 걸릴 수도 있습니다.

온디맨드 동기화를 사용하는 시기

대부분의 게임은 온디맨드로 동기화를 사용하지 않습니다. 게임에서는 스토리지 공간을 획득할 때 온디맨드 동기화를 사용하여 trueXGameSaveInitalizeProvider 또는 XGameSaveInitalizeProviderAsyncsyncOnDemand 매개 변수로 전달할 수 있습니다.

게임에서 저장을 동기화하면 온디맨드 동기화가 변경됩니다.

  • 온디맨드 동기화를 사용하지 않을 때 모든 동기화는 스토리지 공간을 획득할 때 발생합니다. 저장된 게임과 다른 조건의 크기에 따라 게임에 UI가 표시될 수도 있습니다.
  • 온디맨드 동기화를 사용하는 경우 게임에서 XGameSaveReadBlobData 또는 XGameSaveReadBlobDataAsync를 호출하여 저장소 컨테이너로부터 데이터를 읽으려 할 때에만 동기화가 발생합니다. 동기화가 필요한 경우 사용자에게 UI가 표시될 수 있습니다.

온디맨드 동기화는 다음 조건이 모두 충족되는 경우에만 사용해야 합니다.

  1. 게임에는 다수의 컨테이너가 있으며 각 컨테이너는 큽니다.
  2. 게임은 처음으로 저장소 컨테이너에서 읽어야 할 때 활성 게임 플레이의 중간에 있지 않습니다. 첫 번째 읽기는 전체 컨테이너를 동기화해야 한다는 메시지를 표시할 수 있습니다.
  3. 게임 세션에서 제한된 수의 컨테이너에 대한 액세스만을 필요로 합니다.

우발적 덮어쓰기 보호

저장된 게임과 동기화하는 데 시간이 걸릴 수도 있습니다. 사용자는 저장된 게임의 동기화를 취소할 수 있습니다. 이 경우 저장소 공간과 해당 컨테이너가 로컬 장치에 없거나 일부만 동기화될 수 있습니다. 게임은 무엇을 다운로드했을 수 있는가에 대해 잘못된 가정을 하지 않도록 자체적으로 보호해야 합니다.

장치에서 이미 생성된 컨테이너에서 XGameSaveCreateContainer를 호출하면 해당 컨테이너가 열려 게임이 컨테이너에 업데이트를 수행할 수 있습니다.

XGameSaveCreateContainer를 호출하고 해당 컨테이너가 기기에 존재하지 않는 경우(아직 동기화되지 않았거나 게임이 의도적으로 새 컨테이너를 생성하기 때문에) 새 컨테이너가 생성됩니다. 새로운 작업을 수행하려는 경우 이는 예상된 방법입니다. 무언가 동기화되지 않아 발생한 경우 새로(의도치 않게) 생성된 컨테이너가 클라우드의 컨테이너와 충돌할 때 데이터 손실이 발생할 수 있습니다.

이 시나리오로부터 보호하는 것은 간단합니다. create호출 전에 관심이 있는 컨테이너를 항상 열거하면 됩니다. 게임은 XGameSaveEnumerateContainerInfo 또는 XGameSaveEnumerateContainerInfoByName을 호출하여 컨테이너를 열거할 수 있습니다.

저장 시기

게임에서 일시 중단 알림을 받을 때마다 시스템이 사용자의 상황에 적합한 상태로 돌아갈 수 있도록 관련 데이터를 저장해야 합니다.

게임 디자인에서 주기적 저장이나 자동 저장 또는 사용자가 시작한 저장을 사용할 경우 일시 중단 알림을 받을 때보다 자주 XGameSave를 호출할 수 있습니다. 이렇게 하면 정전이나 충돌 때문에 데이터가 손실될 위험을 줄일 수 있습니다.

사용자가 로그아웃하면 해당 사용자의 XUser 개체는 게임에서 로그아웃 지연을 가져온 것으로 간주하고 유효한 상태로 유지됩니다. 이 지연을 통해 게임은 XGameSave API를 사용하여 최종 저장 작업을 수행할 수 있습니다.

일반 지침

컨테이너 간에 종속 데이터를 저장하지 마세요.

복수의 컨테이너 간에 종속성이 있는 데이터를 저장하지 마세요. 완료되지 않은 동기화, 정전 또는 기타 오류 조건으로 인해 컨테이너가 분리될 수도 있습니다. 하나의 컨테이너에 저장된 데이터는 자급 가능하고 자기 모순이 없어야 합니다.

사용자에게 본체의 전원을 끄거나 벗어나지 말라고 권장하지 마세요.

타이틀에서는 저장하는 동안에 사용자가 본체 전원을 끄거나 앱에서 벗어나지 말라고 권장해서는 안됩니다. Xbox One의 경우 타이틀에 일시 중단 이벤트가 수신되고 1초간 XGameSave API를 사용해 상태를 저장할 수 있습니다. 시스템은 완전히 종료되거나 절전 상태에 들어가기 전에 데이터가 하드 드라이브에 제대로 커밋되는지 확인합니다. 사용자가 다른 디스크를 재생하기 위해 타이틀의 디스크를 꺼낼 경우 동일한 일시 중단 프로세스가 발생합니다.

XGameSave API의 비동기 버전을 사용하는 것이 좋습니다. 이렇게 하면 시스템이 게임 저장 데이터를 작성하는 동안 타이틀이 나머지 일시 중단 코드를 계속할 수 있습니다. 이 작업을 수행하는 방법에 대한 예제는 XGameSaveSubmitUpdateAsync를 참조하세요.

게임에서 데이터를 로드하려 할 때 사용자에게 알립니다.

게임에서 XGameSaveInitializeProvider 호출 완료를 대기 중인 경우 앱에서 데이터를 로드하려 하는 것을 사용자에게 시각적으로 표시합니다. 앱에서 전체 화면을 실행 중일 때 동기화 프로세스 도중 시스템에서 UI를 제공하지만 이 UI는 사용자가 홈 화면으로 이동할 때 숨겨집니다. 시스템에서 요청된 XGameSave 저장소 공간에 대해 많은 데이터를 동기화하는 경우에 발생할 가능성이 높습니다.

XGameSave 저장소 공간을 유지하세요.

읽기 또는 쓰기 이벤트가 발생할 때마다 XGameSaveProviderHandle를 가져오려고 하지 말고 유지합니다. 오랜 시간 동안 핸들을 유지해도 성능 또는 견고성에 부정적인 영향을 주지 않습니다.

참고 항목

어느 지점에서든 XGameSave API가 E_GS_HANDLE_EXPIRED를 반환하는 경우 게임은 모든 XGameSave 개체를 삭제하고 XGameSaveProviderHandle을(를) 다시 가져와야 합니다.

데이터 크기를 작게 유지합니다.

저장된 데이터의 크기를 작게 유지합니다. 본체가 온라인 상태가 되면 저장소 공간의 모든 사용자 데이터가 클라우드에 업로드됩니다. 지연 및 대역폭 사용을 최소화하기 위해 데이터 형식을 최적화합니다.

저장된 데이터의 물리적 크기 외에도 컨테이너 내의 blob 수를 고려하세요. 컨테이너가 1MB인 경우에도 해당 컨테이너에 1,000개의 1KB blob가 있는 경우 크기가 더 큰 소수의 blob가 있는 경우보다 동기화 시간이 길어집니다.

사용자가 저장하지 않아도 상관없다고 생각하는지 확인합니다.

XGameSaveInitializeProviderXGameSaveSubmitUpdate에서 반환되는 E_GS_OUT_OF_LOCAL_STORAGE 오류를 확인합니다. 사용자에게 쿼리해 저장하지 않고 플레이할지 확인합니다. 사용자가 게임을 저장하겠다고 답하면 작업을 다시 시도합니다.

사용자의 할당량과 공간을 지우라는 메시지를 확인합니다.

XGameSaveSubmitUpdate에서 반환된 E_GS_QUOTA_EXCEEDED 오류를 확인합니다. 게임에서 이 메시지를 수신하면 여유 공간을 마련할 때까지 더 이상 데이터를 저장할 수 없음을 사용자에게 알립니다. 이것을 할 수 있는 UI를 사용자에게 제공합니다. 각 사용자는 게임당 256MB의 데이터를 갖습니다.

나중에 복원할 수 있도록 메뉴 상태를 저장합니다.

핵심 게임 데이터 외에 메뉴 상태 및 기타 게임 설정을 저장합니다. 사용자가 다른 게임을 플레이하다가 돌아올 경우 상황에 적절한 메뉴 상태로 복원합니다.

로그인되어 있는 사용자 변경 사항에 응답합니다.

게임이 일시 중단된 동안에 사용자가 로그아웃할 수 있습니다. 게임이 다시 시작되면 로그인되어 있는 사용자 집합이 변경되었는지 확인합니다. 이러한 상황이 발생하면 게임 내에서 메뉴와 같은 해당 위치로 이동하는 것이 좋습니다.

PC에서 저장이 안전하지 않습니다.

PC에 데이터 저장 기능이 보호되거나 보호되지 않습니다. 게이머들은 이러한 저장을 찾아 조작할 수 있습니다. 게임은 장치에 로컬로 저장된 중요한 데이터에 의존해서는 안 됩니다. 더 높은 수준의 보호를 원하는 게임은 자신이 작성한 데이터에 대해 자체 해시 솔루션을 구현하고 나중에 해당 데이터를 읽을 때 해시 유효성을 검사할 수 있습니다.

참고 항목

게임 저장 개요
XGameSave API 참조