Toubleshooting mapkit prestaties

stemmen
8

Ik ben het uitzetten van meer dan 500 punten op een kaart met mapkit. Zoomen is een beetje zenuwachtig vergeleken met de natuurlijke google map app. Ik heb ontdekt wat de oorzaak is van de traagheid. Ik ben het toevoegen van aangepaste annotaties, zodat ik later verschillende pin kleuren en knoppen kunt toevoegen voor de standpunten detail:

- (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;
}

Als ik commentaar uit de bovenstaande code, alles werkt prima. Zeer glad met zoomen in / out. Moet ik anders worden het toevoegen van annotaties om prestaties te verbeteren?

De vraag is gesteld op 08/02/2010 om 03:12
bron van user
In andere talen...                            


5 antwoorden

stemmen
6

500 annotaties is waarschijnlijk te veel, maar niet zo veel dat de prestaties lijdt wanneer je alleen kijkt een aantal van hen. Echter, je moet gebruiken dequeueing met uw annotaties om de prestaties te verbeteren

- (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;
}

Ook met 500 pins, de daling van de animatie duurt lang om te voltooien. Je moet draaien die weg[view setAnimatesDrop:NO]

antwoordde op 08/02/2010 om 06:48
bron van user

stemmen
3

Ik schreef een iPhone app voor een cliënt en we inclusief een store locator voor een van hun huismerken. Het omvat 501 locaties en terwijl de animatie een beetje schokkerig wanneer u hebt uitgevoerd om de gehele Verenigde Staten te zien kunnen zijn, het is prima ingezoomd op het niveau van de staat, waar slechts een handvol van de pinnen zijn zichtbaar.

De sleutels:

  • Zoom de gebruiker in hun huidige locatie voordat u uw aantekeningen toevoegen.
  • Hergebruik uitzicht annotatie gebruiken dequeueReusableAnnotationViewWithIdentifier:.

Om het eerste punt te bereiken, moet u in te schakelen locatie-updates en stel een vlag wanneer je de eerste te ontvangen. Animeren de kaart naar die locatie met behulp van een regio overspanning die zinvol is voor uw app, dan in mapView:regionDidChangeAnimated:, om te zien of je nog nodig hebt om uw aantekeningen toe te voegen en dat de huidige locatie is bijgewerkt voordat u belt addAnnotation:.

Als je niet kan of wil niet in te zoomen op de locatie van de gebruiker, kunt u filteren de getoonde op het hoogste niveau annotaties en uitsluitend aanvullende aantekeningen als de gebruiker inzoomt?

By the way, ik geloof dat u een geheugenlek in uw code zoals hierboven geplaatst. Zelfs als u niet wilt dat de dequeuing mechanisme gebruiken, het uitzicht u terugkomt van mapView:viewForAnnotation:moet worden autoreleased.

antwoordde op 10/02/2010 om 16:28
bron van user

stemmen
2

Ik denk dat St3fan juist is. In theorie kun je gewoon blijven toevoegen annotaties om de kaart en laat het uitzicht handvat weergave van hen, maar de realiteit is dat het beter is als je blijft het aftellen een beetje, 500 op het scherm zou in een keer veel te veel om te zien hoe dan ook zijn.

Er is echter nog een stap om te proberen - zorg ervoor dat alle van de standpunten annotatie hebben ondoorzichtig ingesteld op YES als volgt:

annView.opaque = YES; 
antwoordde op 08/02/2010 om 05:22
bron van user

stemmen
1

Als u niet verwijderen van annotaties niet door de gebruiker van het uitzicht gezien, dat is een ding om te doen door middel van MKMapViewDelegate. Als de prestaties vernederend wanneer de gebruiker de zoom-out tot land level kunt u geaggregeerde informatie over zoomniveau's> sommige const waarde presenteren bijvoorbeeld in plaats van 30 annotaties binnen 10 vierkante mijl tonen enkele annotatie als [30 something].

antwoordde op 29/03/2010 om 15:09
bron van user

stemmen
1

Het lijkt mij dat het toevoegen van 500 punten op de kaart om een ​​deel van een kaart ter grootte van het iPhone-scherm heeft geen zin. Er is geen manier waarop je kunt visualiseren dat of klik zelfs op de juiste annotatie.

Kun je niet kijken naar het zoomniveau en het centrum van de kaart en dan beslissen om slechts een deel van annotaties toe te voegen aan de kaart?

Ik denk dat ik heb gezien andere apps dit te doen ook.

antwoordde op 08/02/2010 om 04:29
bron van user

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