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?
- Finalizar todas las actividades iniciadas antes de la actividad
- Java / Android - ¿Cómo imprimir una traza de pila completa?
- Android: ¿Cómo hacer que el lanzador abra siempre la actividad principal en lugar de la actividad infantil? (o de otro modo)
- Insertar androide en pila de actividad
- Android empuja una nueva actividad mientras limpia a otros
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 = {}
- ¿Hay alguna forma de mostrar pilas de Acivity para Android?
- Ver pila de actividades en Android
- ¿Tener demasiadas actividades afecta mi desempeño?
- Error StackOverflow, excepción View.inflate
- Terminar una actividad de otra clase
- Android: Borrar pila de actividad
- Android: ¿Cómo puedo crear una vista de pila deslizable?
- ¿Cómo administrar la pila de actividades?
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);
- Android Hello World en IntelliJ 12 – No se puede encontrar la clase android.app.Activity
- El mejor método de ahorro de batería para actualizaciones de ubicación