Programación de juegos para Android – Heap issues

Trabajo para una pequeña empresa de desarrollo de juegos para Android, y actualmente estoy teniendo un problema. Estoy ejecutando una máquina bastante estándar de Windows 7 x64, con Eclipse y el SDK de Android.

Estaba leyendo la salida de LogCat para mi programa, preguntándome por qué mi juego ni siquiera aparecía. Rápidamente vi todo el montón creciendo, y pensé que podría tener demasiadas texturas / demasiado grande de texturas, etc. Identificé el problema a la textura de carga, entonces empecé a usar DDMS y noté que mi montón no crecerá por encima de 19MB. Corté un par de texturas e intenté construir y ejecutar de nuevo. Para mi sorpresa, el montón no crecería más allá de 6.6MB, consistentemente. ¿Alguien tiene alguna sugerencia?

Tl; dr: Mi montón estaba creciendo a 19MB, a continuación, no, por lo que tomó las texturas que eran más caros de memoria para mantenerlo bajo 19MB en el montón, y ahora mi montón no crecerá más allá de 6,6MB.

EDIT: salida logcat cuando se sacan texturas más grandes:

 08-19 19: 19: 53.744: DEBUG / dalvikvm (4699): GC_FOR_MALLOC liberó 91 objetos / 514016 bytes en 49ms
 08-19 19: 19: 54.184: DEBUG / dalvikvm (4699): GC_FOR_MALLOC liberó 104 objetos / 494088 bytes en 48ms
 08-19 19: 19: 54.404: WARN / ActivityManager (59): ¡El tiempo de espera de lanzamiento ha expirado, abandonando el bloqueo de la vigilia!
 08-19 19: 19: 54.764: DEBUG / dalvikvm (4699): GC_FOR_MALLOC liberado 85 objetos / 384664 bytes en 49ms
 08-19 19: 19: 54.935: WARN / ActivityManager (59): Tiempo de inactividad de actividad para HistoryRecord {4612eec8 com.wickeyware.zombiearcher.android/.AndroidGame}
 08-19 19: 19: 55.234: DEBUG / dalvikvm (4699): GC_FOR_MALLOC liberó 104 objetos / 504648 bytes en 47ms
 08-19 19: 19: 55.875: DEBUG / dalvikvm (4699): GC_FOR_MALLOC liberado 85 objetos / 505712 bytes en 55ms
 08-19 19: 19: 56.905: DEBUG / dalvikvm (4699): GC_FOR_MALLOC liberó 104 objetos / 522392 bytes en 50ms
 08-19 19: 19: 57.535: DEBUG / dalvikvm (4699): GC_FOR_MALLOC liberado 56 objetos / 388896 bytes en 50ms
 08-19 19: 19: 57.695: INFO / WindowManager (59): WIN DEATH: Window {4606a8a0 com.android.launcher / com.android.launcher2.Launcher paused = false}
 08-19 19: 19: 57.705: INFO / ActivityManager (59): El proceso com.android.launcher (pid 4669) ha muerto.
 08-19 19: 19: 57.825: INFO / ActivityManager (59): Baja memoria: No hay más procesos en segundo plano.
 08-19 19: 19: 57.865: INFO / dalvikvm (4699): dvmDdmHandleHpsgChunk (cuando 1, qué 0, montón 0)
 08-19 19: 19: 58.575: DEBUG / ddm-heap (4699): Petición GC de montón
 08-19 19: 19: 58.685: DEBUG / dalvikvm (4699): GC_EXPLICIT liberado 48 objetos / 313440 bytes en 106ms
 08-19 19: 20: 01.015: INFO / ActivityManager (59): El proceso jp.co.omronsoft.openwnn (pid 4677) ha muerto.
 08-19 19: 20: 01.095: WARN / ActivityManager (59): Programación de reinicio del servicio bloqueado jp.co.omronsoft.openwnn / .OpenWnnJAJP en 5000ms
 08-19 19: 20: 01.106: INFO / ActivityManager (59): Baja memoria: No hay más procesos en segundo plano.
 08-19 19: 20: 03.105: INFO / ActivityManager (59): El proceso com.wickeyware.zombiearcher.android (pid 4699) ha muerto.
 08-19 19: 20: 03.155: INFO / WindowManager (59): WIN DEATH: Window {46138b68 SurfaceView paused = false}
 08-19 19: 20: 03.275: INFO / WindowManager (59): WIN DEATH: Window {4612d530 com.wickeyware.zombiearcher.android/com.wickeyware.zombiearcher.android.AndroidGame paused = false}
 08-19 19: 20: 03.425: INFO / ActivityManager (59): Comience proc com.android.launcher para la actividad com.android.launcher / com.android.launcher2.Launcher: pid = 4710 uid = 10025 gids = {}
 08-19 19: 20: 03.425: INFO / ActivityManager (59): Memoria baja: No hay más procesos en segundo plano.
 08-19 19: 20: 03.775: INFO / UsageStats (59): Curriculum vitae inesperado de com.android.launcher mientras se reanudaba en com.wickeyware.zombiearcher.android
 08-19 19: 20: 03.904: INFO / ActivityThread (4710): Proveedor de publicaciones com.android.launcher2.settings: com.android.launcher2.LauncherProvider
 08-19 19: 20: 04.005: DEBUG / dalvikvm (4710): GC_EXTERNAL_ALLOC liberado 985 objetos / 73440 bytes en 58ms
 08-19 19: 20: 04.465: WARN / InputManagerService (59): Recibió RemoteException enviando notificación setActive (false) a pid 4699 uid 10036
 08-19 19: 20: 04.984: INFO / ActivityManager (59): Actividad mostrada com.android.launcher / com.android.launcher2.Launcher: 1703 ms (total 20584 ms)
 08-19 19: 20: 06.124: INFO / ActivityManager (59): Inicie proc jp.co.omronsoft.openwnn para obtener servicio jp.co.omronsoft.openwnn / .OpenWnnJAJP: pid = 4718 uid = 10023 gids = {}

GC_FOR_MALLOC freed 104 objects / 504648 bytes in 47ms 

Este es el disparo del colector de basura. Por desgracia, sin ninguna fuente, nadie aquí podrá ayudarle.

Pero, parece que estás instanciando WAY demasiados objetos y el recolector de basura está casi constantemente disparando.

Hola. No estoy muy seguro de que mi respuesta es correcta, pero tuve un problema similar.

El problema estaba en la creación de una nueva textura para un objeto. Lo hice muchas veces y el resultado fue una excepción similar. Mi solución: antes de establecer una nueva textura en el objeto, borré la antigua.

Por ejemplo:

 // Delete a texture int[] textures = { textureId }; gl.glDeleteTextures(1, textures, 0); // Create new texture ... 

O:

 int oldTextureId = textureId; ... // Create new texture ... // Delete texture int[] textures = { oldTextureId }; gl.glDeleteTextures(1, textures, 0); 
  • Actividades
  • Android finaliza Actividad e inicia otra
  • Crash debido a "corrupción de pila detectada: abortada"
  • Error: Theme.Translucent & FLAG_ACTIVITY_REORDER_TO_FRONT
  • ¿Cómo manipulo la pila de actividades de Android?
  • ¿Cómo evito que onCreate () sea llamado al iniciar una Actividad?
  • Fuera de la memoria de excepción + análisis de volcado de archivos hprof
  • Pila de actividad de Android
  • ¿Cómo puedo inhabilitar "volver" a alguna actividad?
  • ¿Simular la vista de pila en Android 2 (API 5)?
  • Android: borra la pila trasera
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.