2009-11-02 13 views
3

Dans mon application, je dessine des itinéraires de bus au-dessus d'un MapView. Les itinéraires ont entre une douzaine et quelques centaines de coordonnées GPS qui décrivent l'itinéraire que le bus prend.Superpositions de cartes plus efficaces sous Android

Hosted by imgur.com

Le problème que je vais avoir est qu'une fois que je dessine toutes ces lignes de panoramique/zoom le MapView est incroyablement lent (même en cliquant sur le bouton « Retour » prend une minute pour arriver).

Je ne sais pas comment il est pertinent, mais je mets dans un code de débogage, puis vérifié la sortie logcat et l'MapView appelle à plusieurs reprises la méthode draw() du Overlay si quelque chose a changé ou non. Cela se produit plusieurs fois par seconde et provoque une énorme quantité de collecte des ordures (2-3 Mo toutes les secondes).

Est-ce que quelqu'un a des idées/suggestions pour une méthode pour essayer d'accélérer cela?

+0

Est-il possible que vous remplaciez la mauvaise méthode? [Ici] (http://stackoverflow.com/questions/2792263/draw-is-being-constantly-called-in-my-android-map-overlay) vous trouverez une bonne explication du sujet ... – demetrio812

Répondre

5

Je n'ai utilisé que ItemizedOverlay, pas Overlay, donc ces suggestions sont de pure conjecture. Heck, je n'ai même pas beaucoup fait avec l'API graphique 2D.

De toute évidence, la meilleure réponse est de cesser d'appeler draw() tout le temps. Essayez de consigner des traces de pile et voyez si vous pouvez savoir ce qui déclenche tous les appels draw(). Par exemple, dans les groupes Google Android récemment, quelqu'un a remarqué que Chronometer provoque le redessin des widgets dans la même interface chaque seconde. Alors que je peux voir que vous n'avez pas un Chronometer, vous pourriez être en mesure de trouver une cause racine aux appels draw() que vous pouvez corriger.

En supposant que cela ne fonctionne pas, je suppose que le test « si quelque chose a changé ou non » est une combinaison de getLatitudeSpan(), getLongitudeSpan(), getZoomLevel(), et peut-être d'autres méthodes MapView. Et, je suppose que sur chaque draw() vous itérez sur vos points GPS et dessiner l'itinéraire. Si oui, vous pouvez essayer:

  1. Lorsque vous vraiment dessiner, dessiner d'abord à un Canvas soutenu par une Bitmap, puis appliquez la Bitmap sur la Canvas vous remis draw(), et cache Bitmap.
  2. Suivre quelle combinaison de valeurs a été utilisée dans le dernier draw(), et si le draw() suivant est le même, il suffit de réutiliser le Bitmap existant. Sinon, passez à l'étape 1, en vous assurant de libérer le bitmap (ou de le réutiliser, si c'est possible).

Je suppose que, avec l'accélération graphique, un dynamitage Bitmap sur le Canvas est moins cher que l'itération sur les coordonnées et les lignes de dessin. Et, en mettant en cache le Bitmap, vous économiserez sur la génération de place.

De toute façon, juste une idée.

+0

Ouais. .. Je pensais à la route bitmap réutilisable ... ça sonne juste comme du travail :) Je vais voir si je peux comprendre pourquoi il est constamment en train de redessiner. Je me demandais si c'était juste ce que MapView faisait, ou si j'avais des problèmes. De toute évidence, je dois faire plus de tests. –

1

Il existe deux méthodes de dessin dans la classe de superposition. Un avec 3 arguments et un avec 4 arguments. Vous devez remplacer la méthode draw avec 3 arguments. Le fait de surcharger la méthode avec 4 arguments ralentira votre application. C'est exactement ce qui m'est arrivé. Il semble, où sont les exemples dans l'Internet avec la même erreur.