This project is read-only.

Salvataggi, profili e prestazioni

Developer
Jul 25, 2010 at 5:26 PM
Edited Jul 25, 2010 at 5:31 PM
Rendo pubblica una questione che ho affrontato a parole (e qualche linea di codice) prima assieme a Gianpaolo e oggi con Nicola: la struttura dei file di salvataggio. Attualmente abbiamo realizzato una classe di servizio chiamata XmlParser che tramite due funzioni salva e carica il profilo di un giocatore. Il meccanismo di serializzazione/deserializzazione prevede che si definisca una classe (o una struct) contenente tutte le informazioni da salvare all'interno di un singolo file xml. Ora dovremmo definire quali sono queste classi/struct e quindi il numero e la formattazione dei file xml di salvataggio. Parlando di un gioco generico, sostanzialmente noi abbiamo bisogno di salvare i profili dei giocatori, le impostazioni del gioco (ad es. volume, mazzo di carte e stile del background scelti, ecc...), le partite salvate e le informazioni utili per le statistiche. Le opzioni che abbiamo valutato sono le seguenti:

1 - Unico file XML dentro cui salvare tutto quanto. Può risultare piuttosto complicato definire la struct da salvare nel file, e per ogni piccola variazione (ad es. l'utente abilita/disabilita il volume) va aperto tutto il file, individuata l'informazione da cambiare, e salvato di nuovo tutto il file. Può anche essere oneroso dal punto di vista della memoria virtuale e delle prestazioni, visto che siamo su un cellulare.

2 - Un file XML per ogni utente in cui salvare tutti i dati relativi a quell'utente. Ogni volta che si crea un nuovo profilo, bisogna creare un nuovo file. Anche qui la struct del file è piuttosto complicata, ma i file aperti ogni volta saranno più piccoli, per un minor utilizzo di memoria virtuale. Il problema può nascere quando si creano molti profili diversi sullo stesso cellulare (ok, è vero che di norma il MIO cellulare lo uso solo IO, ma potenzialmente il rischio che dopo mesi di gioco ci siano 200 profili salvati esiste). Per risolvere questo problema si potrebbe comunque prevedere un numero massimo di "slot" per salvare i profili.

3 - Tre/quattro file XML diversi, ognuno preposto al salvataggio di dati diversi ad esempio un file per i profili, uno per le impostazioni, uno per le partite salvate e uno per le statistiche. Ognuno di questi contiene una lista di elementi, e ogni elemento contiene un riferimento univoco al profilo cui fa capo (id, username, ...). Questa soluzione permette di aprire solo il file delle impostazioni quando sono nel menu delle impostazioni, o solo il file delle statistiche al termine di una partita o alla visualizzazione delle statistiche. Anche qui tuttavia si presentano più o meno le stesse problematiche già descritte per la seconda opzione, anche se forse con un impatto leggermente minore.

Alcune domande di carattere generale: ogni profilo deve salvare le proprie impostazioni o sono condivise tra tutti i profili? Cioè se io faccio una partita col mio profilo sul cellulare di Gianpaolo e cambio l'aspetto grafico, quando Gianpaolo carica il suo profilo si trova l'aspetto grafico scelto da me? Bruttino, vero? E per le partite salvate? Ogni profilo ha la sua o ce ne può essere soltanto una, condivisa tra tutti i profili, che viene sovrascritta?

Direi che le opzioni 2 e 3 sono più o meno equivalenti, c'è solo da stabilire in maniera definitiva come strutturare i file salvati. E' il caso di pensarci bene quindi invito tutti quanti a fare le proprie valutazioni e osservazioni, perchè una volta scelta una soluzione sarà un po' complicato tornare sui nostri passi. Invito soprattutto Giuseppe a consigliarci in merito al discorso delle prestazioni: sono tutte e tre fattibili, meglio evitarne una o un'altra, ce ne sono altre che non abbiamo considerato?

Per quanto riguarda la realizzazione consiglierei di farla allo stesso modo di SoundManager, cioè tramite template. Questo ci consente di estendere il parser base fatto con i template e definire diversi parser, ognuno dei quali ha definita la struttura che gli serve. Quindi nel caso poi scegliessimo la terza opzione ci sarà un parser che accetta una struct Profile, uno che accetta una struct Settings, ecc...
Che ne pensate?
Coordinator
Jul 26, 2010 at 9:18 AM
Cerchiamo di sfruttare in modo sano files ma soprattutto directories. Ad esempio: + D Profiles | F Profile1.xml | + D Profile1 | | F Configuration.xml | .. altri files e directories del profilo 1 | F Profile2.xml | + D Profile2 | | F Configuration.xml | .. altri files e directories del profilo 2 e cosí via! Vi consiglio molto caldamente :) di evitare una accozzaglia piatta di files, e di usare un file per piú di una singola cosa ben precisa individuabile facilmente dal nome. Solo una nota: fate in modo che se si cancellassero files "da soli" (il WP7 a volte puó farlo se finisce lo spazio su disco) l'applicazione deve dare risposte ragionevoli comunque!
Developer
Aug 4, 2010 at 12:28 PM

Quindi a parte la scomparsa di file non dobbiamo preoccuparci di altro... bene.

Altra questione è la sicurezza: supponiamo di avere nei file dei profili anche gli username e le password per Facebook. Questi dati appaiono in chiaro se qualcuno ha la malsana idea di aprire i file xml con un reader qualsiasi. E' possibile in qualche modo criptare i dati prima di salvarli?

Coordinator
Aug 5, 2010 at 5:12 PM
gperoni wrote:

Quindi a parte la scomparsa di file non dobbiamo preoccuparci di altro... bene.

Altra questione è la sicurezza: supponiamo di avere nei file dei profili anche gli username e le password per Facebook. Questi dati appaiono in chiaro se qualcuno ha la malsana idea di aprire i file xml con un reader qualsiasi. E' possibile in qualche modo criptare i dati prima di salvarli?

 Non mi pare che ci sia modo di accedere ai files cosí facilmente...

 

Comunque prima di sollevare il problema salviamolo in chiaro, poi ci occuperemo di criptarlo!

Developer
Aug 6, 2010 at 5:15 PM

Dove creiamo la directory "Profiles" principale? Dentro la cartella Content o dentro la cartella principale dell'applicazione?

Piccolo problema di path: come recupero il path dell'applicazione? Ho provato con Directory.GetCurrentDirectory() ma ho notato che sul Windows Phone non funziona...

Coordinator
Aug 7, 2010 at 6:34 PM
gperoni wrote:

Dove creiamo la directory "Profiles" principale? Dentro la cartella Content o dentro la cartella principale dell'applicazione?

Piccolo problema di path: come recupero il path dell'applicazione? Ho provato con Directory.GetCurrentDirectory() ma ho notato che sul Windows Phone non funziona...

 Guarda come sono fatte le leaderboards in http://spacebattle.codeplex.com: ti ho aggiunto al progetto!

Developer
Aug 8, 2010 at 10:54 AM

Ah... avevo fatto tutto senza IsolatedStorage perchè avevamo stabilito di non usarlo. Forse ho capito male.

Coordinator
Aug 9, 2010 at 8:46 AM
gperoni wrote:

Ah... avevo fatto tutto senza IsolatedStorage perchè avevamo stabilito di non usarlo. Forse ho capito male.

 Well, IS è il solo modo per salvare files su disco...

Coordinator
Aug 9, 2010 at 8:47 AM
gperoni wrote:

Ah... avevo fatto tutto senza IsolatedStorage perchè avevamo stabilito di non usarlo. Forse ho capito male.

 Comunque alla fine IS ti genera Stream, quindi non dovrebbe essere molto difficile adattare il codice esistente!

Developer
Aug 9, 2010 at 10:01 AM

Già fatto...