2012-03-17 9 views
7

Ho un gioco in cui disegno e sposta bitmap su SurfaceView. L'utente può interagire (trascinare e rilasciare) questi bitmap. Quando il giocatore preme il pulsante home torna in gioco, voglio essere in grado di mettere in pausa il gioco, quindi ripristinarlo dove era prima che lo lasciasse. Qual è il modo migliore per conservare i miei oggetti personalizzati?Dove devo memorizzare il mio stato di gioco?

  1. Devo implementare onSaveInstanceState(Bundle) ed avere tutte le classi i cui oggetti voglio salvare implementare l'interfaccia Parcelable? Questo sarebbe un bel po 'di lavoro, e non sono ancora sicuro di come salvare le cose come le bitmap. Suppongo che non lo farei e vorrei ricaricare quelli dal disco.

    Sono anche confuso su quale tipo di storage offra un bundle: l'archiviazione su disco che non va mai via a meno che non lo si cancelli da soli o l'archiviazione di memoria che va via se il sistema operativo decide di rimuovere il programma dalla memoria mentre è in background . Secondo i commenti in this question, è l'archiviazione su disco. Il documentation implica che si tratta di memoria, dicendo Note that it is important to save persistent data in onPause(), tuttavia non lo trovo molto chiaro. This page implica anche che non sia persistente: dura solo finché l'applicazione rimane in memoria. Quindi qual è?

  2. L'ultimo collegamento sopra riportato suggerisce di utilizzare onRetainNonConfigurationInstance() per mantenere gli oggetti in memoria mentre l'applicazione è in background. Ciò implicherebbe che se il programma viene tolto dalla memoria dal sistema operativo mentre è in background, tutto andrebbe perso. Questo sembra essere quello che fanno più giochi (tutti quelli su cui ho provato): se colpisci la tua casa mentre giochi, poi ritorna, il livello riprende. Se colpisci a casa, apri un sacco di cose (sufficiente per fare in modo che Android rimuova il gioco dalla memoria), quindi torna indietro, non viene ripreso nulla, il gioco inizia dal menu principale. Significa che questo è quello che usano, e se è così, è una buona pratica?

Si noti che la domanda sulla persistenza di un Bundle è solo una curiosità secondaria. Non mi interessa davvero se lo stato di questo gioco non viene salvato in modo permanente e può essere perso dopo che il gioco è in background per un po '(come descritto in 2 sopra). Sono interessato alle migliori pratiche per questo caso.

+1

Solo una piccola nota: Bitmap implementa Parcelable. (Http://developer.android.com/reference/android/graphics/Bitmap.html). Penso che il modo migliore/più sicuro sia implementare la soluzione n. 1. – YuviDroid

+0

@YuviDroid - ah, mi è mancato, grazie :). Ciò significa che posso farlo, ma lascia comunque qualcuno con una reputazione di 168k che implica che non dovrei nella domanda a cui mi sono collegato: http://stackoverflow.com/questions/4285877/which-one-to-use-onsaveinstancestate-vs -nonostainnonconfigurationinstance - Mi piacerebbe sentire alcuni argomenti a favore o contro prima di scegliere un metodo, perché trovo il soggetto molto confuso. – IVlad

risposta

2

L'idea di base è, IMO, identificare la più piccola raccolta di valori che consentirà di ricreare lo stato del gioco. Salva quelli nelle preferenze condivise.

+2

Le preferenze condivise sono decisamente persistenti e potrei ottenere quello che stai dicendo di funzionare. Tuttavia, a mio avviso sarebbe abbastanza disordinato: ho liste di oggetti, con informazioni su stato, frame corrente, posizione, velocità, ecc. Sarebbe molto da salvare e molto da caricare, e se mai decidessi di aggiungere un nuovo tipo di oggetto, un sacco di lavoro per aggiungerlo. Questo sarebbe ancora più lavoro che implementare 'Parcelable', dal momento che le preferenze condivise non ti permettono di salvare parcelables. Questo probabilmente non può essere aiutato se voglio che lo stato del livello sia persistente, ma non mi interessa per questo gioco. – IVlad

Problemi correlati