Superposiciones de mapa más eficientes en Android

En mi aplicación estoy dibujando rutas de autobús en la parte superior de un MapView . Las rutas tienen entre una docena y unas centenas de coordenadas GPS que describen la ruta que toma el autobús.

Alojado por imgur.com

El problema que tengo es que una vez que dibujo todas estas líneas de panoramización / zoom de la MapView es increíblemente lento (incluso haciendo clic en el botón "Atrás" toma un minuto para pasar).

No estoy seguro de lo relevante que es, pero he puesto en algún código de depuración, a continuación, comprobar la salida logcat y el MapView es repetidamente llamando al método draw() de la superposición si algo ha cambiado o no. Esto está sucediendo varias veces por segundo y está causando una gran cantidad de recolección de basura que suceda (2-3 MB cada segundo).

¿Alguien tiene alguna idea / sugerencia para un método para tratar de acelerar esto?

Sólo he utilizado ItemizedOverlay , no Overlay , por lo que estas sugerencias son pura conjetura. Heck, ni siquiera he hecho mucho con la API de gráficos 2D.

Obviamente, la mejor respuesta es conseguir que deje de llamar draw() todo el tiempo. Trate de registrar algunos rastreos de pila y ver si puede averiguar qué está provocando todas las llamadas draw() . Por ejemplo, en los Grupos de Google para Android recientemente, alguien notó que Chronometer hace que los widgets de la misma interfaz de usuario se vuelvan a dibujar cada segundo. Aunque puedo ver que no tiene un Chronometer , puede ser capaz de averiguar alguna causa raíz a las llamadas de draw() que puede corregir.

Suponiendo que no ayuda, estoy adivinando que la prueba de "si algo ha cambiado o no" es una combinación de getLatitudeSpan() , getLongitudeSpan() , getZoomLevel() , y tal vez otros métodos MapView . Y, estoy asumiendo que en cada draw() usted está iterando sobre sus puntos del GPS y dibujando la ruta. Si es así, puede probar:

  1. Cuando realmente dibujas, dibuja primero un Canvas respaldado por un Bitmap , luego aplica el Bitmap de Bitmap en el Canvas que recibes en draw() y almacena en caché ese Bitmap .
  2. Rastrear qué combinación de valores se utilizaron en el último draw() , y si el siguiente draw() es el mismo, sólo reutilizar el Bitmap existente. De lo contrario, vaya al paso # 1, asegurándose de liberar el Bitmap (o reutilizarlo, si es posible).

Estoy adivinando que con la aceleración de gráficos, voladura un Bitmap en la Canvas es más barato que iterar sobre las coordenadas y líneas de dibujo. Y, al almacenar en caché el Bitmap , se ahorrará en la generación de basura.

De todos modos, sólo un pensamiento.

Hay dos métodos de dibujo en la clase de superposición. Uno con 3 argumentos y uno con 4 argumentos. Tienes que anular el método de dibujo con 3 argumentos. Anular el método con 4 argumentos disminuirá la velocidad de la aplicación. Esto es exactamente lo que me pasó. Parece, donde están los ejemplos en Internet con el mismo error.

  • Mi superposición no aparece hasta que se pulse mapView en android
  • ¿Hay alguna forma de que los elementos de la interfaz de usuario se superpongan ligeramente (uno encima del otro) sin usar diseños absolutos?
  • Superponer una actividad en otra actividad O superponer una vista sobre otra
  • ¿Cómo mostrar una ruta entre dos geocoords en google maps?
  • Barra de navegación translúcida (Android 4.4) - Mostrar contenido debajo
  • Dibujar superposición en Android (en todo el sistema)
  • Android: trazado de dibujo como superposición en MapView
  • ¿Por qué mi sistema se superpone capturando todos los toques (no es posible interacción con la vista subyacente)
  • ¿Cómo puedo dibujar una flecha que muestre la dirección de manejo en MapView?
  • Aplicación de Android: mostrar elementos de superposición en AsyncTask
  • Especifique Layout Margen superior para la barra de acción de superposición
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.