Cómo arreglar la representación lenta (vitales de Android)
Tengo una aplicación que aparece en la parte inferior del 25% de la nueva Consola de Google Play – sección de aspectos vitales de Android para renderización lenta. Me preocupa esto debido a los artículos que parecen decir que Google Play puede penalizar su aplicación en la clasificación de Play Store si cae en el 25% inferior.
Sin embargo, parece imposible mejorar esta métrica para mi aplicación. Reproduce música y tiene un SeekBar y TextView que se actualiza cada 250ms como cualquier reproductor de música. Hice el programa básico mínimo para demostrar:
- Google Play no muestra mi aplicación.
- Dispositivos Android: asura, águila y ka
- El seguimiento de campañas de Google Play Store no funciona con la instalación del navegador web
- Cómo eliminar la aplicación publicada de mi cuenta de Android Market?
- ¿Para qué versión de Android debo desarrollar?
public class MainActivity extends AppCompatActivity { int count; SeekBar seekBar; TextView textView; Runnable runnable = new Runnable() { @Override public void run() { textView.setText(Integer.toString(count)); seekBar.setProgress(count); ++count; seekBar.postDelayed(runnable, 250); } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); seekBar = (SeekBar) findViewById(R.id.seek); textView = (TextView) findViewById(R.id.text); seekBar.post(runnable); } }
Proyecto completo aquí: https://github.com/svenoaks/SlowRendering.git
Cuando ejecuto este programa en hardware similar a los dispositivos Nexus, obtengo estos resultados
adb shell dumpsys gfxinfo com.example.xyz.slowrendering
comando adb shell dumpsys gfxinfo com.example.xyz.slowrendering
:
Stats since: 19222191084749ns Total frames rendered: 308 Janky frames: 290 (94.16%) 90th percentile: 32ms 95th percentile: 36ms 99th percentile: 44ms Number Missed Vsync: 2 Number High input latency: 0 Number Slow UI thread: 139 Number Slow bitmap uploads: 0 Number Slow issue draw commands: 283
Esto significaría que casi todos mis fotogramas tomar> 16ms para hacer, supongo que debido a la naturaleza periódica de la actualización. Todas las demás aplicaciones de reproductor de música que he probado también tienen este problema de reproducción lenta en la medida de lo que puedo ver. Me temo que el algoritmo de Google arruinar mi clasificación de aplicaciones, ¿hay alguna manera de mejorar mi puntuación?
- ¿Cómo probar la compra en la aplicación en android?
- Cómo obtener datos de Android Play Store
- Facturación dentro de la aplicación de Android
- Firmar Android APK con un certificado que expira más en el futuro
- Aplicación de Android incompatible con muchos teléfonos
- Mi aplicación de Android no se actualiza en la Google Play Store
- ¿Con qué frecuencia se actualizan las estadísticas de aplicación de Market?
- Obtener enlace a mi aplicación en play.google antes de publicar mi aplicación
El TextView
en su diseño está causando el problema. Debido a que tiene el layout width
de layout width
de wrap_content
, que dice que su anchura tiene que ser igual al ancho del contenido (el texto de este ejemplo). Por lo tanto, cada vez que se llama a TextView.setText
tiene que producirse un paso de medida / diseño caro. El ajuste simple de layout_width
a match_parent
solucionará el problema.
Aquí hay dos imágenes de lo que se toma de systrace
, que demuestran el trabajo ejecutado en el hilo de interfaz de usuario en 1 marco. La parte superior se hace con layout_width=wrap_content
y la inferior con layout_width=match_parent
.
Dos métodos siguientes que he probado mejorarán la tarifa de marco:
-
Si publicas el
seekBar.postDelayed(runnable, 16)
en un intervalo más corto como 16ms (seekBar.postDelayed (seekBar.postDelayed(runnable, 16)
), obtienes este 60fps liso:P / s: No estoy seguro de por qué todavía.
-
Utilice alguna otra forma de actualizar el valor de
count
lugar de dentro delRunnable
. UtiliceView.postOnAnimation(Runnable)
para reprogramar el Runnable. El resultado es 60FPS para el proyecto de ejemplo.
EDIT: dos Runnable
que utiliza postOnAnimation(Runnable)
Runnable runnable = new Runnable() { @Override public void run() { textView.setText(Integer.toString(count)); seekBar.setProgress(count); seekBar.postOnAnimation(this); } }; Runnable updateCount = new Runnable() { @Override public void run() { ++count; seekBar.postDelayed(this, 250); } };
Revisé su código. No estoy seguro si este es el código real o si tienes más a esto. En cualquier caso llamaré la atención sobre algunos de los problemas de renderización en android.
1. OverDraw
Overdraw es donde se pierde el tiempo de procesamiento de la GPU mediante el color en píxeles que sólo se vuelven a colorear por otra cosa. Éstos pueden ser comunes si usted ha agregado un fondo a su disposición del envase del padre y entonces los niños también se agregan un fondo o si usted ha agregado un fondo común en usted archivo de los estilos para el tema de la aplicación y después añadió fondos al resto del xml Archivos de diseño que ha creado.
Las causas para el sobregiro puede ser cualquier cosa, intente comprobar su código para esto. Hay una herramienta de desarrollo instalada en todos los dispositivos móviles para comprobar Overdraw en las opciones de desarrollador. Aquí está la documentación oficial para overdraw.
2. Ver jerarquía
Para procesar cada vista, Android pasa por tres etapas:
1.medida
2.juzgar
3.draw
El tiempo que tarda Android en completar estas etapas es proporcional al número de vistas en su jerarquía. Veo en tu archivo de diseño que tienes un diseño de restricciones que incluye un diseño lineal. No veo el uso de esto. Se ha introducido el diseño de restricciones para ayudar a los desarrolladores a reducir la jerarquía de vistas. Reducir el número de niños que un diseño en particular puede tener. También hay una herramienta para ayudarte con esto. Aquí está la guía androide oficial. Pruebe estos pasos para averiguar los problemas de procesamiento de la GPU.
- Biblioteca de código de barras para Android
- Cómo desactivar la configuración de fecha y hora en Android?