la performance Toubleshooting de MapKit

voix
8

Je tracé plus de 500 points sur une carte à l'aide MapKit. Zooming est un peu nerveux par rapport à l'application google map native. Je l'ai découvert ce qui cause la lenteur. Je l'ajout d'annotations personnalisées afin que je puisse ajouter ultérieurement des couleurs différentes broches et boutons pour des vues de détail:

- (MKAnnotationView *) mapView:(MKMapView *)mapView viewForAnnotation:(AddressNote *) annotation {
    MKPinAnnotationView *annView=[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@currentlocation];
    annView.pinColor = MKPinAnnotationColorGreen;
    annView.animatesDrop=TRUE;
    annView.canShowCallout = YES;
    annView.calloutOffset = CGPointMake(-5, 5);
    return annView;
}

Si je commente le code ci-dessus, tout fonctionne bien. Très lisse avec le zoom avant / arrière. Dois-je ajouter des annotations différemment pour améliorer les performances?

Créé 08/02/2010 à 03:12
source utilisateur
Dans d'autres langues...                            


5 réponses

voix
6

500 annotations est probablement trop, mais pas autant que la performance souffre lorsque vous ne regardez certains d'entre eux. Cependant, vous devez utiliser dequeueing avec vos annotations pour améliorer les performances

- (MKAnnotationView *)mapView:(MKMapView *)mapView
            viewForAnnotation:(id <MKAnnotation>)annotation
{
    MKPinAnnotationView *view = nil;
    if (annotation != mapView.userLocation) {
        view = (MKPinAnnotationView *)[mapView dequeueReusableAnnotationViewWithIdentifier:@"identifier"];
        if (nil == view) {
            view = [[[MKPinAnnotationView alloc] initWithAnnotation:annotation reuseIdentifier:@"identifier"] autorelease];
        }
        [view setPinColor:MKPinAnnotationColorGreen];
        [view setCanShowCallout:YES];
        [view setAnimatesDrop:NO];
    }
    else {
        // Do something with the user location view
    }
    return view;
}

En outre, avec 500 broches, l'animation goutte prend beaucoup de temps pour terminer. Vous devez éteindre ça avec[view setAnimatesDrop:NO]

Créé 08/02/2010 à 06:48
source utilisateur

voix
3

J'ai écrit une application iPhone pour un client et nous avons inclus un localisateur de magasins pour l'une de leurs marques de magasin. Il comprend 501 emplacements et alors que l'animation peut être un peu saccadé lorsque vous avez sur pour afficher l'ensemble des États-Unis, il est parfaitement bien zoomé au niveau de l'État, où seule une poignée de broches sont visibles.

Les clés:

  • Zoom l'utilisateur dans leur emplacement actuel avant d'ajouter vos annotations.
  • La réutilisation des vues d'annotation à l' aide dequeueReusableAnnotationViewWithIdentifier:.

Pour atteindre le premier point, vous devez activer les mises à jour de l' emplacement et définir un indicateur lorsque vous recevez le premier. Animer la carte à cet endroit en utilisant une durée de région qui est logique pour votre application, puis dans mapView:regionDidChangeAnimated:, vérifiez si vous avez encore besoin d'ajouter des annotations et que l'emplacement actuel a été mis à jour avant d'appeler addAnnotation:.

Si vous ne pouvez pas ou ne voulez pas un zoom avant pour l'emplacement de l'utilisateur, vous pouvez filtrer les annotations présentées au plus haut niveau et seulement ajouter des annotations supplémentaires que l'utilisateur effectue un zoom avant?

Soit dit en passant, je crois que vous avez une fuite de mémoire dans votre code comme affiché ci - dessus. Même si vous ne voulez pas utiliser le mécanisme de dequeuing, la vue que vous revenez de mapView:viewForAnnotation:devrait être autoreleased.

Créé 10/02/2010 à 16:28
source utilisateur

voix
2

Je pense que St3fan est correct. En théorie, vous pouvez simplement continuer à ajouter des annotations à la carte et laissez l'affichage de la poignée de vue, mais la réalité est qu'il vaut mieux si vous gardez le compte à rebours un peu, 500 à l'écran serait à la fois être trop nombreux pour voir de toute façon.

Cependant, il y a un pas de plus pour essayer - assurez-vous que toutes les vues d'annotation ont mis opaque OUI comme ceci:

annView.opaque = YES; 
Créé 08/02/2010 à 05:22
source utilisateur

voix
1

Si vous ne supprimez pas les annotations pas vues par l' utilisateur de la vue, c'est une chose à faire à l'aide de MKMapViewDelegate. Si la performance se dégrade lorsque le zoom-out utilisateur au niveau du pays que vous pouvez présenter agrégées informations sur les niveaux de zoom> une valeur const, par exemple au lieu de 30 annotations à moins de 10 miles carrés montrent l' annotation simple comme [30 something].

Créé 29/03/2010 à 15:09
source utilisateur

voix
1

Il me semble que l'ajout de 500 points de la carte à une section d'une carte de la taille de l'écran de l'iPhone n'a pas de sens. Il n'y a aucun moyen que vous pouvez visualiser ou même que cliquer sur l'annotation droite.

Vous ne pouvez pas regarder le niveau de zoom et le centre de la carte, puis décider d'ajouter un sous-ensemble d'annotations à la carte?

Je pense que je l'ai vu d'autres applications font aussi.

Créé 08/02/2010 à 04:29
source utilisateur

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more