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?

2 Solutions collect form web for “Superposiciones de mapa más eficientes en Android”

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.

  • ¿Cómo crear una superposición que bloquea los eventos de toque a la interfaz de usuario debajo de él?
  • Cómo crear una superposición de información en Android
  • Información sobre Android sobre superposiciones flotantes / elementos sobre otras aplicaciones
  • Comportamiento extraño en el navegador de Android al seleccionar campos
  • Entender boundCenterBottom ()
  • Pantalla emergente / superpuesta en panal de android
  • Color de relieve de superposición de círculo no dibujado siempre en Google Maps v2
  • Animación superpuesta a una actividad de la cámara
  • Disposición de Android: coloca una vista entre dos vistas
  • Superponer imagen para hacer tutorial en la aplicación para Android
  • Colocar una vista de imagen como imagen de superposición en la vista previa de la cámara
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.