Android + Recolector de basura

bLero

Hola chicos,

He desarrollado un pequeño motor gráfico 2D para juegos en Android. Es algo bastante sencillo pues no incluyo físicas, ni gráficos avanzados (OpenGL). Utilizo un Canvas en un RenderView directamente para pintar.

Ya he realizado dos juegos utilizando este motor, uno de plataformas (con físicas de palo) y otro de cartas, en concreto "la brisca" multijugador a traves de bluetooth.

Los juegos funcionan perfectamente, y fluidos (probados en un Galaxy S2 y Galaxy Ace 2). Lo que me mosquea es el recolector de basura. El logcat no deja de mostrarme mensajes de que se ha liberado memoria congelando la aplicación entre 3 y 15 ms.

Se que en Java hay que joderse porque el recolector pasa cuando le da la gana, e incluso intento programar de forma que no deje referencias muertas, utilizando variables globales, y cuando tengo que eliminar objetos trato de quitarlos todos de una vez, para que libere la memoria en una pasada.

Aun con todo eso me parece que el recolector pasa de manera excesiva, por eso pregunto, ¿Qué mecanismos utilizais para controlar el recolector y por tanto aumentar el rendimiento de la aplicación?

OpenGL, me imagino que estará mucho más optimizado para el 2D que pintar en un Canvas, así que creo que será lo próximo que introduciré en el framework.

elkaoD

Lo único que puedes hacer es minimizar tu uso de objetos. No concatenar String sino usar StringBuilder, reusar objetos, pooling, etc...

Aún así no sé cómo estará Java en móvil (más bien Dalvik) pero en escritorio los nuevos GC hacen el pooling ellos solitos y suele haber poca ganancia de rendimiento haciéndolo a mano.

Aún así mientras que no notes bajones de rendimiento no te preocupes por esos mensakes.

Usuarios habituales

  • elkaoD
  • bLero