2011-01-07 15 views
5

He estado trabajando en un juego para Android y depurándolo en mi N1. El rendimiento fue desigual al principio. Luego trabajé en la limpieza de todas las asignaciones para evitar la recolección de basura. Esto mejoró mucho las cosas, pero todavía vi algunas recolecciones de basura que causaron pausas muy breves en la animación.Android Game Development and Garbage Collection

Después de tirarme de los pelos por un tiempo, noté que los identificadores de proceso que estaban haciendo la recolección de basura (GC_FOR_MALLOC) no eran mi identificación de proceso. El proceso Ids pertenecía a "Android System" y android.process.acore (determinado mediante el uso de la aplicación "Android System Info" del mercado). El proceso de acore estaba vinculado a un widget de escritorio llamado reloj digital. Desinstalé el widget y casi lo logro durante todo el juego sin pausas. Hubo una breve pausa para GC para "Sistema Android".

Lo siento por la larga explicación, pero ahora para mis preguntas:

  1. Cómo es posible que otros juegos no de vez en cuando tienen pausas debido a la del proceso del sistema GC (algo fuera de control del desarrollador)?
  2. En la línea de la primera pregunta, ¿cómo puedo manejar una aplicación diferente que causa GC que ralentiza mi proceso y causa hipo en mi juego?

Simplemente siento que hay algo que me falta, ya que otros juegos no tienen este problema.

Gracias

+1

Si su aplicación es tan sensible al recolector de basura, lo está haciendo mal. – Falmarri

+0

Puede tener mejor suerte en http://gamedev.stackexchange.com/ para preguntas específicas de desarrollo de juegos. No estoy seguro de que haya una respuesta fácil para esto. No puedes evitar las gc, solo minimizarlas. 2.3 incluye gc concurrente, pero eso no te ayuda mucho si quieres apuntar a plataformas anteriores. –

Respuesta

3

¿Se puede disminuir la velocidad de cuadro de su juego? Tal vez esté usando el 100% de la CPU, de modo que cualquier otra cosa que consuma la CPU lo retrasará. Estos dispositivos no son tan rápidos como una PC normal. También podría considerar reducir la CPU requerida para crear cada cuadro a fin de mantener la velocidad de cuadro lo suficientemente alta para que sea uniforme.

+0

Lo has clavado exactamente. Mi juego usaba 100% de CPU. Lo más importante que hice para arreglar eso fue cambiar cómo se dibujó el fondo para no procesar la transparencia (función a continuación). Mi CPU cayó inmediatamente desde allí. Una vez que la CPU no estaba vinculada, nunca me di cuenta de la recolección de basura. thx – Steve0212

+0

Un poco tarde para la fiesta, pero tengo un problema similar. ¿Cómo se usa menos del 100% de CPU, aparte de simplemente dormir al final de cada cuadro? ¿Y qué herramienta estás usando para medir el uso de la CPU? Además, ¿no es la transparencia/no transparencia realmente un usuario de GPU, no una CPU? ¡Gracias! – Tenfour04

+0

@ TenFour04: Casi por definición, utiliza menos CPU al asegurarse de hacer el menor trabajo posible. A veces eso significa usar un formato de imagen diferente (el alfa es costoso, particularmente si tienes una GPU horrible o ninguna), a veces significa almacenar una referencia a cosas para que no tengas que buscarlas todas las veces ... a veces significa esperar hasta que sepas que tienes que hacer algo antes de hacerlo. Los detalles varían, pero todo se reduce a "no perder los ciclos de CPU". Ah, y dormir es algo bueno; si se hace bien, mantiene las tasas de fotogramas relativamente estables. – cHao

0
private static Bitmap GetNonTransparentBitmap(int Id) { 
    // no transparency 
    Drawable tmp = myContext.getResources().getDrawable(Id); 

    Bitmap retval = Bitmap.createBitmap(tmp.getMinimumWidth(), tmp.getMinimumHeight(), Bitmap.Config.RGB_565); 
    Canvas canvas = new Canvas(retval); 
    tmp.setBounds(0, 0, tmp.getMinimumWidth(), tmp.getMinimumHeight()); 
    tmp.draw(canvas); 
    return retval; 
}