Significado de los mensajes del coreógrafo en Logcat [duplicar]


Esta pregunta ya tiene una respuesta aquí:

Instalé las últimas versiones de SDK (API 16) y obtuve la última ADT. Ahora estoy viendo estos mensajes en el logcat, que estoy bastante seguro, no he visto antes. ¿Alguien tiene una idea sobre esto?

06-29 23: 11: 17.796: Yo / Coreógrafo(691): Omitió 647 fotogramas! El la aplicación puede estar haciendo demasiado trabajo en su hilo principal.

Hice una búsqueda y encontré este enlace: http://developer.android.com/reference/android/view/Choreographer.html. Esta es una nueva clase introducida en la API 16.

Necesito saber cómo puedo determinar qué" demasiado trabajo " puede estar haciendo mi solicitud, ya que todo mi procesamiento se realiza en AsyncTask s.

Author: M.G, 2012-06-29

5 answers

Choreographer permite que las aplicaciones se conecten a vsync y cronometren correctamente las cosas para mejorar el rendimiento.

Android view animations utiliza internamente a Choreographer para el mismo propósito: cronometrar correctamente las animaciones y posiblemente mejorar el rendimiento.

Dado que al Coreógrafo se le informa sobre todos los eventos de vsync, puedo decir si uno de los Runnables pasó a lo largo por el Coreógrafo.las api de post* no terminan en el tiempo de un fotograma, lo que hace que los fotogramas se omitan.

En mi understanding Choreographer solo puede detectar el salto de fotograma. No tiene forma de saber por qué sucede esto.

El mensaje "La aplicación puede estar haciendo demasiado trabajo en su hilo principal."podría ser engañoso.

 131
Author: CuriousChettai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-07-04 12:34:24

Llego tarde a la fiesta, pero espero que esto sea una adición útil a las otras respuestas aquí...

Respondiendo a la pregunta / tl: dr; {[16]]}

Necesito saber cómo puedo determinar qué "demasiado trabajo" puede estar haciendo mi aplicación, ya que todo mi procesamiento se realiza en AsyncTasks.

Los siguientes son todos los candidatos:

  • IO o procesamiento costoso en el hilo principal (cargando elementos de diseño, inflando diseños y configurando Uri en ImageView constituyen IO en el hilo principal)
  • Rendering large/complex / deep View jerarquías
  • Invalidando grandes porciones de una View jerarquía
  • Costosos onDraw métodos en custom View's
  • Cálculos caros en animaciones
  • Ejecutando subprocesos" worker "con una prioridad demasiado alta para ser considerados" background "(AsyncTask's son" background " por defecto, java.lang.Thread es no)
  • Generando mucha basura, haciendo que el recolector de basura "detenga mundo" - incluyendo el hilo principal - mientras limpia

Para realmente determinar la causa específica que necesitará para crear un perfil de su aplicación.

Más detalles

He estado tratando de entender al coreógrafo experimentando y mirando el código .

La documentación del Coreógrafo se abre con "Coordina el tiempo de animaciones, entrada y dibujo."lo que en realidad es una buena descripción, pero el resto continúa enfatizando demasiado animaciones.

El Coreógrafo es en realidad responsable de ejecutar 3 tipos de callbacks, que se ejecutan en este orden:

  1. callbacks de manejo de entrada (manejo de entrada de usuario como eventos táctiles)
  2. callbacks de animación para interpolar entre fotogramas, proporcionando un tiempo de inicio de fotogramas estable a cualquier/todas las animaciones que se están ejecutando. Ejecutar estos callbacks 2nd significa que cualquier cálculo relacionado con la animación (por ejemplo, cambiar las posiciones de la vista) ya se ha realizado en el momento en que el se invoca el tercer tipo de devolución de llamada...
  3. callbacks de recorrido de vistas para dibujar la jerarquía de vistas.

El objetivo es hacer coincidir la velocidad a la que las vistas invalidadas se vuelven a dibujar (y las animaciones se interpolan) con la vsync de pantalla, normalmente a 60 fps.

La advertencia sobre los fotogramas omitidos parece una ocurrencia tardía: El mensaje se registra si un solo pasar por los 3 pasos toma más de 30 veces la duración esperada del fotograma, por lo que el número más pequeño que puede esperar ver en los mensajes de registro es "omitido 30 frames"; Si cada paso toma un 50% más de lo que debería, aún se saltará 30 fotogramas (naughty!) pero no se te advertirá de ello.

De los 3 pasos involucrados está claro que no solo las animaciones pueden activar la advertencia: Invalidar una porción significativa de una jerarquía View grande o un View con un método onDraw complicado podría ser suficiente.

Por ejemplo, esto activará la advertencia repetidamente:

public class AnnoyTheChoreographerActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        setContentView(R.layout.simple_linear_layout);

        ViewGroup root = (ViewGroup) findViewById(R.id.root);

        root.addView(new TextView(this){
            @Override
            protected void onDraw(Canvas canvas) {
                super.onDraw(canvas);
                long sleep = (long)(Math.random() * 1000L);
                setText("" + sleep);
                try {
                    Thread.sleep(sleep);
                } catch (Exception exc) {}
            }
        });
    }
}

... que produce el registro como este:

11-06 09:35:15.865  13721-13721/example I/Choreographer﹕ Skipped 42 frames!  The application may be doing too much work on its main thread.
11-06 09:35:17.395  13721-13721/example I/Choreographer﹕ Skipped 59 frames!  The application may be doing too much work on its main thread.
11-06 09:35:18.030  13721-13721/example I/Choreographer﹕ Skipped 37 frames!  The application may be doing too much work on its main thread.

Puedes ver en la pila durante onDraw que el coreógrafo está involucrado independientemente de si estás animando:

Por ejemplo.AnnoyTheChoreographerActivity 1 1.onDraw (AnnoyTheChoreographerActivity.java:25) en android.vista.Vista.dibujar (Ver.java:13759)

... un poco de repetición ...

En Android.vista.ViewGroup.drawChild (ViewGroup.java:3169) en androide.vista.ViewGroup.dispatchDraw (ViewGroup.java:3039) en android.vista.Vista.dibujar (Ver.java:13762) en android.widget.FrameLayout.draw (FrameLayout.java: 467) at com.androide.interno.directiva.impl.Ventana telefónica Decor vista de decoración.draw (PhoneWindow.java:2396) en android.vista.Vista.getDisplayList (View.java:12710) en android.vista.Vista.getDisplayList (View.java:12754) en android.vista.HardwareRenderer Gl GlRenderer.draw (HardwareRenderer.java:1144) en android.vista.ViewRootImpl.dibujar(ViewRootImpl.java:2273) en android.vista.ViewRootImpl.performDraw (ViewRootImpl.java:2145) en android.vista.ViewRootImpl.performTraversals (ViewRootImpl.java:1956) en android.vista.ViewRootImpl.doTraversal (ViewRootImpl.java:1112) en android.vista.Ver el TIMPL Tra TraversalRunnable.ejecutar(ViewRootImpl.java:4472) en Android.vista.Coreógrafo$CallbackRecord.corre (Coreógrafo.java:725) en android.vista.Coreógrafo.doCallbacks(Coreógrafo.java:555) en android.vista.Coreógrafo.doFrame(Coreógrafo.java: 525) en android.vista.Coreógrafo$FrameDisplayEventReceiver.corre (Coreógrafo.java:711) en android.operativo.Handler.handleCallback (Handler.java:615) en android.operativo.Handler.DispatchMessage (Handler.java: 92) en android.operativo.Looper.loop (Looper.java:137) en android.app.ActivityThread.main (ActivityThread.java:4898)

Finalmente, si hay contención de otros hilos que reducen la cantidad de trabajo que el hilo principal puede hacer, la probabilidad de saltar fotogramas aumenta dramáticamente a pesar de que en realidad no estás haciendo el trabajo en el hilo principal.

En esta situación, podría considerarse engañoso sugerir que la aplicación está haciendo demasiado en el hilo principal, pero Android realmente quiere que los hilos de trabajo se ejecuten con baja prioridad para evitar que se muera de hambre el hilo principal. Si los hilos de trabajo son de baja prioridad, la única forma de activar la advertencia del coreógrafo es hacer demasiado en el hilo principal.

 62
Author: Stevie,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:18:07

Esto es un mensaje de información que podría aparecer en su LogCat en muchas situaciones.

En mi caso, sucedió cuando estaba inflando varias vistas de archivos de diseño XML mediante programación. El mensaje es inofensivo por sí mismo, pero podría ser el signo de un problema posterior que usaría toda la RAM que su Aplicación puede usar y causaría que la Fuerza del mega mal esté Cerca de suceder. He crecido para ser el tipo de desarrollador que le gusta ver su Registro WARN/INFO/ERROR Libre. ;)

Así que, esto es mío experiencia:

Recibí el mensaje:

10-09 01:25:08.373: I/Choreographer(11134): Skipped XXX frames!  The application may be doing too much work on its main thread.

... cuando estaba creando mi propia "lista multi-sección súper compleja" al inflar una vista desde XML y rellenar sus campos (imágenes, texto, etc.)...) con los datos provenientes de la respuesta de un servicio web REST/JSON (sin capacidades de paginación), estas vistas actuarían como filas, encabezados de subsección y encabezados de sección agregando todos ellos en el orden correcto a un LinearLayout (con orientación vertical dentro de una vista de desplazamiento). Todo eso para simular una vista de lista con elementos en los que se puede hacer clic... pero bueno, eso es para otra pregunta.

Como Desarrollador responsable quieres hacer que la Aplicación sea realmente eficiente con los recursos del sistema, por lo que la mejor práctica para las listas (cuando tus listas no son tan complejas) es usar una ListActivity o ListFragment con un Cargador y llenar la ListView con un Adaptador, esto es supuestamente más eficiente, de hecho lo es y deberías hacerlo todo el tiempo, de nuevo... si su lista no es así complejo.

Solución: Implementé paginación en mi servicio web REST/JSON para evitar "tamaños de respuesta grandes" y envolví el código que agregó las vistas "filas", "encabezados de sección" y "encabezados de subsección" en una AsyncTask para mantener fresco el Hilo Principal.

So... Espero que mi experiencia ayude a alguien más que se está abriendo la cabeza con este mensaje de información.

Feliz hacking!

 24
Author: Oscar Salguero,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2014-01-10 19:50:29

Esto suele ocurrir al depurar usando el emulador, que se sabe que es lento de todos modos.

 11
Author: Buzz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-08-10 18:57:10

En mi caso tengo estos mensajes cuando muestro la barra de acciones sherlock inderterminate progressbar. Como no es mi biblioteca, decidí ocultar las salidas del coreógrafo.

Puede ocultar las salidas de Choreographer en la vista Logcat, usando esta expresión de filtro:

Etiqueta:^((?!Coreógrafo).*)$

He usado una expresión regular explicada en otro lugar: Expresión regular para que coincida con una línea que no contiene una palabra?

 11
Author: Julien,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-05-23 12:02:42