2012-03-17 19 views
7

Tengo un juego donde dibujo y muevo bitmaps sobre un SurfaceView. El usuario puede interactuar (arrastrar y soltar) estos mapas de bits. Cuando el jugador presiona el botón de inicio y luego regresa al juego, quiero poder detener el juego, luego restaurarlo a donde estaba antes de que lo dejara. ¿Cuál es la mejor manera de almacenar mis objetos personalizados?¿Dónde debería guardar mi estado de nivel de juego?

  1. ¿Debo aplicar onSaveInstanceState(Bundle) y tienen todas las clases cuyos objetos Quiero salvar implementar la interfaz Parcelable? Esto sería bastante trabajo, y todavía no estoy seguro de cómo podría guardar cosas como mapas de bits. Supongo que no lo haría y solo los volvería a cargar desde el disco.

    También estoy confundido acerca de qué tipo de almacenamiento ofrece un paquete: almacenamiento en disco que nunca desaparece a menos que lo borre usted mismo, o almacenamiento de memoria que desaparece si el SO decide eliminar su programa de memoria mientras está en segundo plano . De acuerdo con los comentarios en this question, es el almacenamiento en disco. El documentation implica que es memoria de almacenamiento, diciendo Note that it is important to save persistent data in onPause(), sin embargo, no me parece muy claro. This page también implica que no es persistente: solo dura mientras la aplicación permanezca en la memoria. Entonces, ¿cuál es?

  2. El último enlace anterior sugiere usar onRetainNonConfigurationInstance() para mantener objetos en la memoria mientras la aplicación está en segundo plano. Esto implicaría que si el sistema OS extrae el programa de la memoria mientras está en segundo plano, todo se perderá. Esto parece ser lo que hacen la mayoría de los juegos (todos los que probé): si tocas el inicio mientras juegas y vuelves a entrar, el nivel se reanuda. Si tocas el inicio, abres muchas cosas (suficientes para que Android elimine el juego de la memoria), luego vuelves, no se reanuda nada, el juego comienza en el menú principal. ¿Eso significa que esto es lo que usan, y si es así, ¿es una buena práctica?

Tenga en cuenta que la pregunta sobre la persistencia de Bundle es solo una curiosidad secundaria. Realmente no me importa si el estado de este juego no se guarda de forma permanente y se puede perder después de que el juego esté en segundo plano por un tiempo (como se describe en 2 arriba). Estoy interesado en la mejor práctica para este caso.

+1

Una pequeña nota: el mapa de bits implementa Parcelable. (http://developer.android.com/reference/android/graphics/Bitmap.html). Creo que la mejor/más segura forma es implementar su solución n. ° 1. – YuviDroid

+0

@YuviDroid - ah, lo extrañé, gracias :). Eso significa que puedo hacerlo, pero aún deja a alguien con una reputación de 168k implicando que no debería en la pregunta a la que me he vinculado: http://stackoverflow.com/questions/4285877/which-one-to-use-onsaveinstancestate-vs -sintenerinstancia de configuración-Me gustaría escuchar algunos argumentos a favor o en contra antes de elegir un método, porque encuentro el tema muy confuso. – IVlad

Respuesta

2

La idea básica es, IMO, identificar la colección de valores más pequeña que le permitirá recrear el estado de su juego. Guarde ésos en preferencias compartidas.

+2

Las preferencias compartidas son definitivamente persistentes y podría obtener lo que dices que funcione. Sin embargo, sería bastante complicado en mi opinión: tengo listas de objetos, con información sobre el estado, el marco actual, la posición, la velocidad, etc. Sería mucho ahorrar y mucho cargar, y si alguna vez decido agregar un nuevo tipo de objeto, mucho trabajo para agregarlo. Esto sería incluso más trabajo que implementar 'Parcelable', ya que las preferencias compartidas no le permiten guardar parcelas. Esto probablemente no se puede evitar si quiero que el nivel de estado sea persistente, pero realmente no me importa eso para este juego. – IVlad

Cuestiones relacionadas