> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Game Saves の同期フローについて

> XBOX Game Saves の 6 段階の同期フロー (タイトル開始、接続チェック、データ所有権、クラウド同期、ゲームプレイ ループ、セッション終了) について説明します。

この記事では、Game Saves の 6 部構成の同期フローについて説明します。使用する特定の Game Saves API によって動作が若干異なる場合がありますが、ユーザー主導のセーブに対する一般的なフローは同じです。手順は次のとおりです。

1. [タイトル開始](/build/core-features/common/game-save/game-saves-syncing#title-start)
2. [接続チェック](/build/core-features/common/game-save/game-saves-syncing#connection-check)
3. [データ所有権チェック](/build/core-features/common/game-save/game-saves-syncing#data-ownership-check)
4. [クラウドとのデータ同期](/build/core-features/common/game-save/game-saves-syncing#syncing-data-with-the-cloud)
5. [ゲームプレイ ループ](/build/core-features/common/game-save/game-saves-syncing#gameplay-loop)
6. [セッション終了](/build/core-features/common/game-save/game-saves-syncing#session-end)

## タイトル開始

タイトルが起動すると、最初の手順は Game Saves の管理対象となるユーザーを決定することです。ユーザーが別のデバイスでアクティブなゲーム セッションを持っている場合、ユーザーにデバイスの切り替えを求めるシステム ダイアログが表示されます。ユーザーが切り替えると、他のデバイスは最新のローカル Game Saves データを新しいデバイスに同期します。データをローカルに保持してデバイスにバインドしたい場合は、マシン専用プロバイダーを使用できます。このオプションでは、Game Saves API に `null` のユーザー ハンドルを渡します。

タイトルがユーザーを選択したら、そのユーザーのハンドルを使って Game Saves を初期化します。初期化中、Game Saves は XBOX ネットワークに接続してユーザーのストレージ スペースを準備します。

| API              | Game Saves プロバイダーの初期化関数                |
| ---------------- | -------------------------------------- |
| `XGameSave`      | `XGameSaveInitializeProvider()`        |
| `XGameSaveFiles` | `XGameSaveFilesGetFolderWithUIAsync()` |

関連するシステム ダイアログ:

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/signed-into-another-device.png?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=b333cb6234262d4b20d1b00cfa7119f7" alt="他のデバイスでサインインしているようです。" width="792" height="1026" data-path="images/gdk/features/common/signed-into-another-device.png" />

ユーザー モデルとユーザー管理の詳細については、[ユーザー モデル](/build/core-features/common/game-save/game-saves-developer-guide#user-models) を参照してください。

ストレージの詳細については、[Game Saves ストレージ システム](/build/core-features/common/game-save/game-saves-storage-systems) を参照してください。

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/sync-flow-1-title-start.jpg?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=e73bde01a012a367ec751c0f00a760c5" alt="同期プロセスの最初の手順のフローチャート。" width="663" height="1258" data-path="images/gdk/features/common/sync-flow-1-title-start.jpg" />

## 接続チェック

次に、タイトルはクラウドへの同期が可能であることを確認するために、XBOX ネットワークに接続できるかを判定します。タイトルが接続できない場合、ユーザーは再試行するか、オフライン モードでタイトルを再開するかのオプションが提供されます。Game Saves はオフライン モードで実行できます。

関連するシステム ダイアログ: <img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/sync-failed-network-dialogue.jpg?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=2d1a2c71ac69baac7aa3863e5308554d" alt="現在データをクラウドに同期できませんでした。" width="1006" height="559" data-path="images/gdk/features/common/sync-failed-network-dialogue.jpg" />

<img src="https://mintlify.s3.us-west-1.amazonaws.com/microsoft-4404708b/build/core-features/common/game-save/game-saves-dialogues#we-couldnt-get-your-latest-saved-data" alt="最新のセーブ データを取得できませんでした。" />

### オフライン時の動作

| XBOX ネットワーク アクセス | データ同期パターン                                                                   |
| ---------------- | --------------------------------------------------------------------------- |
| あり               | 通常のクラウド同期フロー。データ所有権チェックへ進みます。                                               |
| なし               | オフライン モード: タイトルはユーザーのローカル Game Saves ストレージにデータを保存しますが、現在のセッションはクラウドと同期しません。 |

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/sync-flow-2-connection-check.jpg?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=abc4d0abd4bcce59bce850fb348d19fb" alt="同期プロセスの接続チェック手順のフローチャート。" width="598" height="444" data-path="images/gdk/features/common/sync-flow-2-connection-check.jpg" />

## データ所有権チェック

接続が確認された後、タイトルはデバイスがデータを変更する権利を持っているかを判定します。デバイスにその権利がある場合、タイトルへのロックを取得できます。タイトルがロックを取得および解放するには、タイトルが XBOX services にアクセスできる必要があります。

タイトルは、ユーザーのデータへのロックを保持している別のデバイスがあるかを確認します。次のような理由で、このデバイスがまだロックを保持している可能性があります。

* XBOX ネットワークから切断されており、デバイスが `WebReleaseLock` を呼び出せない。
* もう一方のデバイスが大きな Game Save をアップロード中で `WebReleaseLock` を呼び出せない。

別のデバイスがロックを保持している場合、ユーザーには次のオプションがあります。

* 他のデバイスから強制的にロックを取得する。他のデバイスはセッション データを失います。
* 通常どおり再度ロックを取得しようとする。
* ロック取得をキャンセルする。

ユーザーがロック取得をキャンセルすると、タイトルはオフライン モードで起動します。

接続喪失とロックのシナリオの詳細については、[接続喪失とロックのシナリオ](/build/core-features/common/game-save/game-saves-syncing#connection-loss-and-lock-scenarios) を参照してください。

関連するシステム ダイアログ:

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/lock-contention-dialogue.jpg?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=38894f740f55a181c2137b3c9b84cb18" alt="もう一方の XBOX 本体がクラウドへの同期に時間がかかっています" width="639" height="563" data-path="images/gdk/features/common/lock-contention-dialogue.jpg" />

XBOX ネットワーク上でのロック取得の監視の詳細については、[Game Saves ネットワーク トラフィックの検査](/build/core-features/common/game-save/game-saves-tools#inspecting-game-saves-network-traffic) を参照してください。

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/sync-flow-3-data-ownership-check.jpg?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=b21137181a92b3e1afaad2618bea46ae" alt="同期プロセスのデータ所有権チェックのフローチャート。" width="846" height="1092" data-path="images/gdk/features/common/sync-flow-3-data-ownership-check.jpg" />

## クラウドとのデータ同期

タイトルがユーザーのデータへのロックを取得した後、そのデータをクラウドと同期します。次に、タイトルは次のいずれかのアクションを行うかを判定します。

* ローカルの Game Saves データをアップロードする。
* クラウド データをダウンロードし、ローカルの Game Saves データを更新する。
* 何もしない。
* データの競合を解決する。

タイトルは、次の 2 つのタイムスタンプを比較することでこれを判定します。

* **ローカル セーブ時刻**: このデバイスが最後にセーブを書き込んだ時刻
* **クラウド セーブ時刻**: クラウド コピーが最後に更新された時刻

### 4 つの同期結果

| ローカル vs. クラウド | アクション             | 意味                                                   |
| ------------- | ----------------- | ---------------------------------------------------- |
| どちらも変更なし      | 何もしない             | 両方の場所でデータが一致しています。新しい進捗はありません。                       |
| ローカルのみ変更      | ローカル>クラウドへのアップロード | ユーザーがオフラインでプレイしました。より新しいローカルのゲーム セーブ データをクラウドに送信します。 |
| クラウドのみ変更      | クラウド>ローカルへのダウンロード | ユーザーが別のデバイスでプレイしました。クラウドからそのゲーム セーブ データを取得します。       |
| 両方とも変更        | 競合>ユーザーに確認        | 各場所で進捗があります。他のデバイスにはありません。ユーザーが解決します。                |

<Note>
  クラウドからのダウンロードが発生する場合、同期ダイアログが表示されます: [...のデータを同期中...](/build/core-features/common/game-save/game-saves-dialogues#syncing-data)。ユーザーがこのダイアログを使用して Game Saves をキャンセルすると、タイトルはオフライン モードで続行します。
</Note>

### 変更とセーブの状態

このシナリオは、ユーザーが 2 つのデバイス (デバイス A とデバイス B) でプレイしていることを想定しています。

**ローカル変更**

ユーザーがデバイス A でオフライン中に進捗を作成しました。たとえば、ユーザーがインターネット接続なしでデバイス A でレベル 126 に到達しました。

**クラウド変更**

ユーザーが最後にデバイス A を同期して以降、デバイス B から進捗がアップロードされました。たとえば、ユーザーがデバイス B でレベル 99 に到達し、クラウドにアップロードしました。

**両方変更**

ユーザーがデバイス A でオフラインでプレイしました。ユーザーはまた、最後にデバイス A を同期して以降、デバイス B でもプレイしました。たとえば、デバイス A はレベル 126 です。クラウドはレベル 99 です。

競合がある場合、システムは次のダイアログで解決するようユーザーに求めます: [どちらを使用しますか?](/build/core-features/common/game-save/game-saves-dialogues#which-one-do-you-want-to-use)

### 原子性

Game Saves はコンテナー (フォルダー) レベルで原子性があります。クラウド フォルダーに、対応するローカル フォルダーにない BLOB が含まれている場合、システムは 2 つのフォルダーを別々のものとして扱います。この差異が競合を引き起こします。

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/sync-flow-4-sync-data-with-cloud.jpg?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=2e20d3966826e47b9b79c5bf30cc9227" alt="同期プロセスのクラウド同期のフローチャート。" width="930" height="1119" data-path="images/gdk/features/common/sync-flow-4-sync-data-with-cloud.jpg" />

## ゲームプレイ ループ

*ゲームプレイ ループ* は、ゲーム セッションのアクティブな部分です。これは、タイトルがクラウドとセーブ データの同期を完了した後に始まります。

アクティブなゲーム セッション中、タイトルはローカルでセーブ データを読み書きします。この期間中に作成または更新されたすべてのデータは、システムがクラウド同期を実行するまで Game Saves のローカル ストレージに残ります。

コンソールまたは PC で次のいずれかの条件が真の場合、ユーザーのゲーム セッションが終了したときにゲームプレイ ループが終了します。セッションは、コンソールまたは PC が中断、終了、サインアウト、または他のシステム イベントなどの状態変化をトリガーしたときに終了します。

### クラウドへの定期的な同期

ゲームプレイの 30 分ごとに、タイトルは自動的にクラウドとの同期を試みます。この動作は次のシナリオに基づいています。

| Game Saves API                  | アクション             | いつ                                  |
| ------------------------------- | ----------------- | ----------------------------------- |
| `XGameSaveFiles`、ノーコード クラウド セーブ | ローカル>クラウドへのアップロード | 指定されたセーブ エリアにゲームが書き込んでから 30 分経過した時。 |
| `XGameSave`                     | ローカル>クラウドへのアップロード | ゲームプレイの 30 分ごと。                     |

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/sync-flow-5-gameplay-loop.jpg?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=3a0165fb65cfb429d4455e018b4fd95f" alt="Game Saves とのゲームプレイ ループのやり取りのフローチャート。" width="714" height="977" data-path="images/gdk/features/common/sync-flow-5-gameplay-loop.jpg" />

## セッション終了

ゲーム セッションが終了した後、タイトルは新しいデータをクラウドにアップロードします。デバイスは、接続がある場合にクラウドへのデータのアップロードを試みます。データがアップロードされた後、ロックは解放されます。

デバッグのために XBOX ネットワーク上でのロック解放を確認するには、[Game Saves ネットワーク トラフィックの検査](/build/core-features/common/game-save/game-saves-tools#inspecting-game-saves-network-traffic) を参照してください。

<img src="https://mintcdn.com/microsoft-4404708b/UZTRJSf0emX1fheE/images/gdk/features/common/sync-flow-6-session-end.jpg?fit=max&auto=format&n=UZTRJSf0emX1fheE&q=85&s=fb2ca714223c6846bcf37775a7d98c6f" alt="同期プロセスのセッション終了動作のフローチャート。" width="1384" height="587" data-path="images/gdk/features/common/sync-flow-6-session-end.jpg" />

## 接続喪失とロックのシナリオ

接続喪失中に書き込まれたデータは、Game Saves のローカル ストレージに保存され、接続が復元された後にアップロードされます。ただし、ユーザーが別のデバイスを使用しようとした場合、現在のデバイスは接続が失われたためロックを解放できません。ユーザーは、ロックを別のデバイスに強制的に転送できます。これらのロック転送が発生するタイミングによって、タイトルは異なる動作を経験することがあります。

### タイトル開始前の接続喪失

> **タイミング:** ユーザーが接続なしでタイトルを起動します。

接続がないため、タイトルはユーザーにオフライン モードで起動するオプションを提供します。デバイスが XBOX ネットワークに再接続し、クラウドがより新しいデータを含んでいる場合、タイトルはローカル データを古いものとして扱います。この場合、タイトルは中断操作でアプリを終了することでゲーム セッションを終了します。

関連するシステム ダイアログ: [このゲームまたはアプリを閉じる必要があります](/build/core-features/common/game-save/game-saves-dialogues#we-need-to-close-this-game-or-app)

### ゲームプレイ ループ中の接続喪失

> **タイミング:** ユーザーはアクティブなゲーム セッション中で、タイトルはまだロックを保持しています。ある時点で接続が失われます。タイトルはその間もゲームプレイを許可します。

| オフライン デバイス | 再接続時のロック状態    | 再接続時のタイトルの動作                         | ユーザー エクスペリエンス/UI |
| ---------- | ------------- | ------------------------------------ | ---------------- |
| コンソール      | 引き続きロックを保持    | 引き続きローカルに保存。                         | セーブはローカル ストレージへ。 |
| コンソール      | 別のデバイスがロックを取得 | タイトルは終了します。                          | ホーム画面に戻る。        |
| PC         | 引き続きロックを保持    | 引き続きローカルに保存。                         | セーブはローカル ストレージへ。 |
| PC         | 他のデバイスがロックを取得 | ゲームプレイは通常どおり再開します。競合の解決は次回の同期で行われます。 | ゲームプレイが再開します。    |

### セッション終了 (終了または中断) 前の接続喪失

> **タイミング:** プレイヤーはデバイスが切断されている状態でタイトルを終了/中断します。デバイスにはまだ同期されていないローカル データがあります。

| オフライン デバイス | 接続喪失の時点 | 再接続時のロック状態    | 再接続時のデバイスの動作                          |
| ---------- | ------- | ------------- | ------------------------------------- |
| コンソール      | 終了前     | 引き続きロックを保持    | データがアップロードされ、ロックが解放されます。              |
| コンソール      | 終了前     | 他のデバイスがロックを取得 | データは次回のタイトル開始時にマージ解決を通過します。           |
| コンソール      | 中断前     | 引き続きロックを保持    | データがアップロードされ、ロックが解放されます。              |
| コンソール      | 中断前     | 他のデバイスがロックを取得 | タイトルが終了され、データは次回のタイトル開始時にマージ解決を通過します。 |
| PC         | 終了前     | 引き続きロックを保持    | データがアップロードされ、ロックが解放されます。              |
| PC         | 終了前     | 他のデバイスがロックを取得 | データは次回のタイトル開始時にマージ解決を通過します。           |
| PC         | 中断前     | 引き続きロックを保持    | データがアップロードされ、ロックが解放されます。              |
| PC         | 中断前     | 別のデバイスがロックを取得 | データは次回のタイトル開始時にマージ解決を通過します。           |

## 電源喪失

電源喪失は接続喪失と同様に動作します。主な違いは、アクティブだったセーブ操作が失われることです。


## Related topics

- [Game Saves の概要](/ja-jp/build/core-features/common/game-save/game-saves-overview.md)
- [Game Saves のデバッグ](/ja-jp/build/core-features/common/game-save/game-saves-debugging.md)
- [XGameSaveFiles API の概要](/ja-jp/build/core-features/common/game-save/xgamesavefiles.md)
- [Game Saves システム ダイアログ](/ja-jp/build/core-features/common/game-save/game-saves-dialogues.md)
- [XGameSave API の概要](/ja-jp/build/core-features/common/game-save/xgamesave.md)
