Sua pergunta é realmente ampla por causa do grande número de gêneros existentes, mas aqui está a perspectiva de um desenvolvedor de software profissional.
Você forneceu uma lista de critérios que deseja usar para determinar qual mecanismo de persistência de dados você usa. Esses foram:
- O tamanho do projeto.
- A plataforma alvo do jogo.
- A complexidade da estrutura de dados.
- Portabilidade de dados entre muitos projetos.
- Com que frequência os dados devem ser acessados
- Vários tipos de dados para um mesmo aplicativo
- Qualquer outro ponto que você julgue interessante ao decidir o que usar.
Primeiro, precisamos estabelecer quais opções estão disponíveis para nós. Como você não especificou um idioma ou tecnologia, é difícil dizer exatamente, mas você provavelmente está tentando decidir entre XML e armazenamento de banco de dados relacional .
Uma distinção importante a ser feita é que o XML não é realmente um mecanismo de armazenamento sim uma técnica de serialização. É uma maneira de representar estruturas na memória para o seu jogo. Dado isso, você está realmente falando sobre arquivo simples versus armazenamento de banco de dados relacional . Essas não são as únicas opções, mas são as mais comuns, então vou usá-las.
Para arquivos simples:
- XML
- JSON
- YAML
- XAML
- Texto simples
Para bancos de dados:
- servidor SQL
- MySQL
- DB2
- Oráculo
- Muito mais
EDITAR: Você perguntou sobre outros tipos de mecanismos além de arquivos e bancos de dados relacionais. O único outro tipo notável de banco de dados que eu já vi usado regularmente são os bancos de dados "no estilo Berkeley", que são essencialmente baseados em valores-chave. Eles tendem a usar árvores B para estruturar dados, para que as pesquisas sejam rápidas. Eles são ótimos para pesquisar configurações onde você sabe exatamente o que deseja (por exemplo, forneça todos os dados de telemetria do "Nível 1").
Agora que já temos todos os princípios básicos, vamos tocar em alguns dos seus critérios.
O tamanho do projeto.
Alguns podem discordar, mas o tamanho do seu projeto não terá necessariamente um enorme impacto no mecanismo de persistência de dados. Você desejará criar uma biblioteca reutilizável de funções que armazene / carregue dados de qualquer mecanismo que desejar. Eu até sugeriria a implementação de uma camada de abstração (consulte o padrão do adaptador ) para que você pudesse alterar facilmente seu mecanismo de persistência, se necessário.
Dito isto, em pequenos projetos, o uso de XML no sistema de arquivos pode potencialmente funcionar bem, mas você deseja resolver algumas de suas preocupações de segurança (ou seja, criptografia) para que os jogadores não possam alterar os dados à vontade.
A plataforma alvo do jogo.
A plataforma também não será um grande problema. Você deve estar mais preocupado com sua plataforma de desenvolvimento do que com a plataforma de destino. A razão para isso é que algumas linguagens lidam com certos tipos de marcação ou bancos de dados melhor do que outras imediatamente. Isso não quer dizer que você não possa usar nenhum dos itens acima em quase nenhum idioma, mas às vezes é melhor usar as ferramentas suportadas disponíveis. Qualquer plataforma suporta arquivos simples e analisa XML, mas em plataformas móveis você pode considerar a serialização binária, se possível, ou pelo menos otimizar seu XML para armazenamento.
A complexidade da estrutura de dados.
Isso é meio complicado. Os bancos de dados relacionais são ótimos apenas para ... armazenar entidades e seus relacionamentos. Você tem uma capacidade melhor de impor a estrutura usando um repositório de armazenamento relacional do que os arquivos em um sistema de arquivos. Considere os tipos de relacionamento entre suas entidades e a frequência com que você as altera ou encontra entidades relacionadas. Para estruturas extremamente complexas, sugiro seguir a rota do banco de dados.
Portabilidade de dados entre muitos projetos.
Quando se trata de portabilidade, você deve considerar o fato de que os bancos de dados são naturalmente mais pesados que os arquivos. Há sobrecarga de instalação e configuração, bancos de dados diferentes estarão disponíveis para plataformas diferentes, etc. O SQLite é uma boa maneira de contornar isso. No entanto, quando se trata de portabilidade, você provavelmente terá mais facilidade com soluções baseadas em arquivo como XML.
EDIT: Existem outras preocupações que você mencionou sobre portabilidade em um de seus comentários. Por fim, você não deseja que seus dados sejam acoplados com muita força a qualquer produto ou tipo de arquivo. Em última análise, é melhor se você pode armazenar dados de estoque (níveis, inimigos etc.) em algum tipo de formato abstrato (arquivos delimitados por tabulação, XML etc.) que você pode analisar e armazenar facilmente em um banco de dados / sistema de arquivos durante a compilação ou carregamento. Tempo. Isso significa que você pode trocar seu mecanismo de armazenamento por um capricho e apenas reescrever a peça de análise.
Com que frequência os dados devem ser acessados
Muito acesso a dados significa muita E / S, a menos que você tenha algum tipo de mecanismo de armazenamento em cache. Os bancos de dados mantêm estruturas na memória e são ótimos para manipulação e recuperação de dados. Se você realmente persistir constantemente com os dados, convém manter um banco de dados.
Vários tipos de dados para um mesmo aplicativo
O volume é certamente uma consideração, mas, a menos que você esteja falando sobre a persistência de milhares ou milhões de objetos, o sistema de arquivos ainda será aceitável como solução.
Tipo de jogo
O tipo de jogo que você está construindo pode ter uma enorme influência na plataforma que você escolher. Sim, para a maioria dos jogos para um jogador apenas para um cliente, você ficará bem usando uma solução baseada em sistema de arquivos compactados ou criptografados. Se você está falando de jogos com um componente online, isso seria uma loucura. Siga a rota do banco de dados e salve a dor de cabeça. Deixe o servidor gerenciar todos os seus dados usando um cluster de back-end.
Espero que alguns desses comentários ajudem. Não é de forma alguma abrangente, e tomar a decisão depende de você, mas meu comentário deve lhe dar algumas considerações.
EDIT: Há momentos em que adotar uma abordagem híbrida faz muito sentido. Por exemplo, digamos que você esteja desenvolvendo um MMORPG. No lado do cliente, você pode armazenar dados em cache sobre outros players em um banco de dados não relacional (como mencionado acima). No lado do servidor, você está armazenando todos os dados do jogo em um banco de dados relacional para persistir. E, novamente, no lado do cliente, você provavelmente está armazenando dados de log, dados de configuração etc. em arquivos XML / simples para facilitar a acessibilidade.
Outro pôster também mencionou que, às vezes, é bom, mesmo se você estiver armazenando dados para produção em um banco de dados, ter uma maneira de usar arquivos simples para desenvolvimento ... pode ser mais fácil remover outro produto da mistura .