Game Save の競合とアトミック ユニット
概要
セーブの競合は、複数のデバイスで同じゲーム データを変更した場合に発生します。システムはどちらのバージョンを保持するかを決定する必要があります。セーブ データの構造を設計するには、システムが競合をどのように検出および解決するかを理解する必要があります。競合が発生するタイミング
競合は、同期操作 (PFGameSaveFilesAddUserWithUiAsync) の実行時に、以下のすべての条件が true の場合にのみ発生します。
- ローカルの変更が存在する: 最後の同期以降にローカルでファイルを変更した。
- クラウドの変更が存在する: 最後の同期以降に別のデバイスが新しいデータをアップロードした。
- 同じアトミック ユニット: 両方の変更が同じルート レベルのフォルダーにある。
競合検出マトリックス
アトミック ユニットとは?
一部のファイル同期システムでは、ファイルごとに競合を扱います。同じファイルをアップロードとダウンロードする必要がある場合は競合とみなされます。Game Saves では、各ルート レベルのサブフォルダーが アトミック ユニット として扱われます。各ルート レベルのサブフォルダーは 1 つのアトミック ユニットです。
- データ整合性の維持: 相互依存するファイルは一貫して維持されます
- 分離の提供: 別々のフォルダー内の独立したデータは競合なく同期されます
- 競合の最小化: 異なるデバイス上の異なるアトミック ユニットへの変更は自動的にマージされます
セーブ構造の例
競合シナリオ
ルート レベルのファイル: 特殊なケース
セーブ ルートにあるすべてのファイルは 1 つのアトミック ユニットを共有します。 システムは、セーブ ルート (任意のサブフォルダーではなく) に直接配置したすべてのファイルを 1 つのアトミック ユニットとしてまとめてグループ化します。ローカルで 1 つのルート レベル ファイルを変更し、別のデバイスが別のルート レベル ファイルを変更した場合、この違いによって競合が発生します。ユーザーの選択オプション
競合が発生すると、プレイヤーは以下から選択します。- ローカル データを使用 (Keep Local): デバイスの現在のセーブ データを保持します。
- クラウド データを使用 (Keep Cloud): クラウドのセーブ データをダウンロードして使用します。
重要: 解決はオール オア ナッシング
⚠️ 重要: アトミック ユニットは競合が いつ 検出されるかを決定しますが、ユーザーの競合解決の選択はアトミック ユニット単位ではなく セーブ全体 に適用されます。
例: 混在する競合シナリオ
これが重要な理由
- Keep Local はクラウドのみの変更を失う: SlotA の競合により「Keep Local」を選択すると、別のデバイスが行った SlotC へのクラウド更新を受け取れません。
- Keep Cloud はローカルのみの変更を失う: 「Keep Cloud」を選択すると、クラウドの状態が SlotB と SlotD へのローカル変更を上書きします。
- ロールバックが利用可能: いずれの選択も、将来のロールバック機能のために破棄されたブランチを保持します。
設計のまとめ
このオール オア ナッシングのアプローチはプレイヤー エクスペリエンスをシンプルにします。アトミック ユニット単位の解決は技術的にはデータの一貫性を維持しますが (アトミック ユニットが一貫性の境界を定義するため)、ユーザー エクスペリエンスの課題を生み出します。
- プレイヤーはアトミック ユニットとフォルダー境界の概念を理解する必要があります。
- 混在した結果 (一部のフォルダーはローカルから、他はクラウドから) はプレイヤーを最終状態について困惑させる可能性があります。
- 競合するアトミック ユニットごとに個別にプロンプトを表示すると、競合解決が圧倒的になります。
競合が発生しない場合
両側での削除
両方のデバイスが同じファイル (または同じアトミック ユニット内のファイル) を削除する場合、競合は発生しません。システムは両方のデバイスがそのファイルを削除すべきだと合意していると認識します。異なるアトミック ユニット内の変更
デバイス A がSlotA/ 内のファイルを変更し、デバイス B が SlotB/ 内のファイルを変更する場合、競合は発生しません。同期は両方の変更を自動的にマージします。
ベスト プラクティス
1. フォルダー構造を慎重に設計する
独立したセーブ ユニットにはサブフォルダーを使用します。- 共有参照データ: アンロック済みコンテンツや実績など、任意のセーブ スロットが使用する可能性のあるデータを独自のサブフォルダーに格納すると、個々のセーブ スロットとは独立して同期されます。
- 大きなアセット コレクション: ゲームがダウンロード済みコンテンツ パックやユーザー作成のレベルなど、独立して更新される大きなファイル セットを保存する場合は、それらを複数のルート サブフォルダーに分割することを検討してください。あるコレクションの更新が別のコレクションの更新と競合しないようにします。
