> ## 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.

# Conflitos do Game Saves

> Resolva conflitos do PlayFab Game Saves quando os dados salvos locais e na nuvem divergirem, usando estratégias de sincronização para proteger o progresso dos jogadores entre dispositivos.

# Conflitos do Game Save e unidades atômicas

## Visão geral

Os conflitos de salvamento acontecem quando você modifica os mesmos dados do jogo em vários dispositivos. O sistema precisa decidir qual versão manter. Para projetar a estrutura dos seus dados salvos, você precisa entender como o sistema detecta e resolve conflitos.

## Quando os conflitos acontecem

Os conflitos acontecem durante a operação de sincronização (`PFGameSaveFilesAddUserWithUiAsync`) somente quando todas as condições a seguir são verdadeiras:

1. **Existem alterações locais**: você modificou arquivos localmente desde a última sincronização.
2. **Existem alterações na nuvem**: outro dispositivo carregou dados mais recentes desde a última sincronização.
3. **Mesma unidade atômica**: ambas as alterações estão na mesma pasta de nível raiz.

### Matriz de detecção de conflitos

| Alterações no dispositivo local | A nuvem tem alterações na mesma unidade atômica | Resultado |
| - | - | - |
| Arquivos modificados | Sim | **CONFLITO** |
| Arquivos excluídos | Sim | **CONFLITO** |
| Nenhuma alteração | Sim | O download prossegue |
| Arquivos modificados | Não | O upload prossegue |
| Arquivos excluídos | Não | A exclusão prossegue |

## O que é uma unidade atômica?

Alguns sistemas de sincronização de arquivos tratam os conflitos arquivo por arquivo. Se o mesmo arquivo precisar ser carregado e baixado, há um conflito. No Game Saves, cada subpasta de nível raiz é tratada como uma *unidade atômica*.

<Note>
  **Cada subpasta de nível raiz é uma unidade atômica.**
</Note>

Se algum arquivo ou subpasta dentro de uma subpasta de nível raiz precisar ser baixado e algum arquivo ou pasta nessa mesma subpasta raiz precisar ser carregado, toda a unidade atômica estará em conflito.

Essa abordagem permite:

* **Manter a integridade dos dados**: arquivos interdependentes permanecem consistentes juntos
* **Fornecer isolamento**: dados independentes em pastas separadas são sincronizados sem conflitos
* **Minimizar conflitos**: alterações em unidades atômicas diferentes em dispositivos diferentes são mescladas automaticamente

### Exemplo de estrutura de salvamento

```
SaveRoot/
├── save.dat              ← Atomic unit: root
├── player.dat            ← Atomic unit: root
├── Save1/
│   ├── stats.json        ← Atomic unit: Save1
│   └── inventory.json    ← Atomic unit: Save1
├── Save2/
│   ├── stats.json        ← Atomic unit: Save2
│   └── inventory.json    ← Atomic unit: Save2
└── WorldState/
    ├── map.dat           ← Atomic unit: WorldState
    └── npcs/
        └── positions.dat ← Atomic unit: WorldState
```

### Cenários de conflito

| Alterações no Dispositivo A | Alterações no Dispositivo B | Conflito? | Por quê |
| - | - | - | - |
| `Save1/stats.json` | `Save1/inventory.json` | **SIM** | Mesma unidade atômica: Save1 |
| `Save1/stats.json` | `Save2/stats.json` | Não | Unidades diferentes: Save1 vs Save2 |
| `WorldState/map.dat` | `WorldState/npcs/positions.dat` | **SIM** | Mesma unidade atômica: WorldState |
| `save.dat` | `Save1/stats.json` | Não | Unidades diferentes: raiz vs Save1 |
| `player.dat` | `save.dat` | **SIM** | Mesma unidade atômica: raiz |

## Arquivos de nível raiz: caso especial

**Todos os arquivos na raiz do salvamento compartilham uma única unidade atômica.**

O sistema agrupa todos os arquivos que você coloca diretamente na raiz do salvamento (fora de qualquer subpasta) como uma única unidade atômica. Se você modificar um arquivo de nível raiz localmente e outro dispositivo modificar um arquivo de nível raiz diferente, essa diferença dispara um conflito.

| Dispositivo A (local) | Dispositivo B (nuvem) | Mesma unidade atômica? | Resultado |
| - | - | - | - |
| Modifica `rootfile1.txt` | Modifica `rootfile2.txt` | ✅ SIM | **CONFLITO** |
| Modifica `rootfile1.txt` | Modifica `save1/config.ini` | ❌ NÃO | Sem conflito, ambos sincronizam |
| Exclui `save.dat` | Modifica `progress.dat` | ✅ SIM | **CONFLITO** |

## Opções de escolha do usuário

Quando ocorrem conflitos, os jogadores escolhem entre:

* **Use Local Data (Keep Local)**: manter os dados salvos atuais do dispositivo.
* **Use Cloud Data (Keep Cloud)**: baixar e usar os dados salvos na nuvem.

### Importante: a resolução é tudo ou nada

<Note>
  ⚠️ **Importante**: embora as unidades atômicas determinem *quando* um conflito é detectado, a escolha de resolução de conflito do usuário se aplica ao **salvamento inteiro**, e não por unidade atômica.
</Note>

### Exemplo: cenário de conflito misto

```
SaveRoot/
├── SlotA/ ← Local: modified, Cloud: modified  → CONFLICT
├── SlotB/ ← Local: modified, Cloud: unchanged → Local-only change
├── SlotC/ ← Local: unchanged, Cloud: modified → Cloud-only change
└── SlotD/ ← Local: modified, Cloud: unchanged → Local-only change
```

**O usuário vê o prompt de conflito** (devido a SlotA).

| Escolha do usuário | SlotA | SlotB | SlotC | SlotD |
| - | - | - | - | - |
| **Keep Local** | ✅ Local mantido | ✅ Local carregado | ❌ Alteração da nuvem **PERDIDA** | ✅ Local carregado |
| **Keep Cloud** | ✅ Nuvem baixada | ❌ Alteração local **sobrescrita** | ✅ Nuvem baixada | ❌ Alteração local **sobrescrita** |

### Por que isso importa

1. **Keep Local perde as alterações que existem apenas na nuvem**: se você escolher "Keep Local" por causa de um conflito em SlotA, não receberá a atualização na nuvem em SlotC feita por outro dispositivo.

2. **Keep Cloud perde as alterações que existem apenas localmente**: se você escolher "Keep Cloud", o estado da nuvem sobrescreverá suas alterações locais em SlotB e SlotD.

3. **Reversão disponível**: ambas as escolhas preservam o branch descartado para uma futura capacidade de reversão.

### Resumo do design

| Aspecto | Granularidade |
| - | - |
| **Detecção** de conflitos | Por unidade atômica (subpasta raiz) |
| **Resolução** de conflitos | Salvamento inteiro (tudo ou nada) |

Essa abordagem de tudo ou nada simplifica a experiência do jogador. Embora a resolução por unidade atômica mantenha tecnicamente a consistência dos dados (já que as unidades atômicas definem os limites de consistência), ela cria desafios de experiência do usuário:

* Os jogadores precisam entender o conceito de unidades atômicas e limites de pastas.
* Resultados mistos (algumas pastas locais, outras da nuvem) podem deixar os jogadores confusos sobre o estado final.
* Solicitar uma escolha para cada unidade atômica em conflito separadamente torna a resolução de conflitos excessiva.

Ao apresentar uma única escolha entre **Keep Local** e **Keep Cloud**, os jogadores tomam uma decisão clara sem precisar entender a estrutura de salvamento subjacente.

## Quando os conflitos não ocorrem

### Exclusão em ambos os lados

Se ambos os dispositivos excluírem o mesmo arquivo (ou arquivos na mesma unidade atômica), **nenhum conflito ocorre**. O sistema reconhece que ambos os dispositivos concordam que o arquivo deve ser removido.

### Alterações em unidades atômicas diferentes

Se o Dispositivo A modificar arquivos em `SlotA/` e o Dispositivo B modificar arquivos em `SlotB/`, nenhum conflito ocorre. A sincronização mescla automaticamente as duas alterações.

## Práticas recomendadas

### 1. Projete a estrutura de pastas com cuidado

Use subpastas para unidades de salvamento independentes:

```
SaveRoot/
├── Slot1/           ← Each slot is independent
│   └── save.dat
├── Slot2/
│   └── save.dat
```

Um sistema de salvamento de jogo baseado em slots, em que cada slot é uma subpasta de nível raiz, é um exemplo simples de como você pode usar unidades atômicas de forma eficaz.

Outros exemplos incluem:

* **Dados de referência compartilhados**: armazene os dados que qualquer slot de salvamento pode usar, como conteúdo desbloqueado ou conquistas, em sua própria subpasta, para que sejam sincronizados independentemente dos slots de salvamento individuais.
* **Grandes coleções de ativos**: se o seu jogo armazenar grandes conjuntos de arquivos atualizados de forma independente, como pacotes de conteúdo baixados ou níveis criados por usuários, considere dividi-los em várias subpastas raiz para que as atualizações de uma coleção não entrem em conflito com as de outra.

### 2. Evite arquivos de nível raiz para dados modificados com frequência

Todos os arquivos de nível raiz compartilham uma única unidade atômica. Evite colocar na raiz arquivos modificados com frequência se quiser sincronizá-los de forma independente.

**Em vez de:**

```
SaveRoot/
├── autosave.dat     ← All root files = 1 atomic unit
└── save1.dat
└── save2.dat
```

**Considere:**

```
SaveRoot/
├── AutoSave/
│   └── autosave.dat     ← Independent unit
└── Save1/
    └── gamesave.dat ← Independent unit
```

### 3. Agrupe dados relacionados

Use a mesma pasta para arquivos que precisam permanecer consistentes entre si.

```
SaveRoot/
├── Save1/
│   ├── stats.json       ← These files are interdependent
│   ├── inventory.json   ← and should conflict together
│   └── quests.json
```

### 4. Minimize os conflitos

Faça uploads com frequência para reduzir a chance de conflitos. Quanto mais frequentemente você sincronizar, menor a probabilidade de dois dispositivos terem alterações divergentes.

### 5. Monitore as taxas de conflito

Use os [eventos do PlayStream](/pt-BR/services/playfab/player-progression/game-saves/playstream-events) para acompanhar com que frequência os conflitos ocorrem e como os jogadores os resolvem. Uma taxa de conflitos crescente ou uma forte tendência para "keep local" em vez de "keep remote" pode sinalizar problemas de UX ou de cadência de salvamento que valem a pena investigar.


## Related topics

- [Início rápido do Game Saves](/pt-BR/services/playfab/player-progression/game-saves/quickstart.md)
- [Reversão do Game Saves](/pt-BR/services/playfab/player-progression/game-saves/rollback.md)
- [Retornos de chamada de interface do Game Saves](/pt-BR/services/playfab/player-progression/game-saves/ui-callbacks.md)
- [Caixas de diálogo do sistema do Game Saves](/pt-BR/build/core-features/common/game-save/game-saves-dialogues.md)
- [Perguntas frequentes sobre tratamento de erros do Game Saves](/pt-BR/services/playfab/player-progression/game-saves/error-handling-faq.md)
