Toubleshooting wydajność mapkit

głosy
8

Mam kreślenia ponad 500 punktów na mapie przy użyciu mapkit. Powiększanie jest trochę roztrzęsiony porównaniu do natywnego google map app. Odkryłam, co jest przyczyną powolność. Dodaję własne adnotacje, tak że mogę później dodać różne kolory pin i przyciski do widoków szczegółowych:

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

Gdybym skomentuj powyższy kod, wszystko działa bez zarzutu. Bardzo gładka i powiększanie / zmniejszanie. Powinienem być dodawanie adnotacji w różny sposób, aby zwiększyć wydajność?

Utwórz 08/02/2010 o 03:12
źródło użytkownik
W innych językach...                            


5 odpowiedzi

głosy
6

500 adnotacje jest prawdopodobnie zbyt wiele, ale nie tak wiele, że cierpi wydajność podczas oglądania tylko niektóre z nich. Jednak należy używać dequeueing z adnotacji w celu zwiększenia wydajności

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

Również 500 szpilek animacja kropli potrzeba dużo czasu do końca. należy to wyłączyć z[view setAnimatesDrop:NO]

Odpowiedział 08/02/2010 o 06:48
źródło użytkownik

głosy
3

Napisałem aplikację iPhone dla klienta i włączono lokalizator sklep dla jednego ze swoich marek sklepowych. Obejmuje ona 501 lokalizacji i podczas gdy animacja może być jerky nieco po znacznym powiększeniu się, aby zobaczyć całą Stanów Zjednoczonych, to perfekcyjnie powiększony na poziomie państwa, gdzie tylko garstka szpilki są widoczne.

Klucze:

  • Powiększyć użytkownika do ich aktualnego miejsca przed dodawać adnotacje.
  • Reuse widoki adnotacji użyciu dequeueReusableAnnotationViewWithIdentifier:.

Aby osiągnąć pierwszy punkt, trzeba włączyć aktualizacje lokalizacji i ustawić flagę, gdy pojawi się pierwszy. Animować mapę do tej lokalizacji z wykorzystaniem rozpiętość regionu, który ma sens dla swojej aplikacji, a następnie w mapView:regionDidChangeAnimated:sprawdź, czy trzeba jeszcze dodać adnotacje i że aktualna pozycja została zaktualizowana przed wywołaniem addAnnotation:.

Jeśli nie możesz lub nie chcesz, aby powiększyć do lokalizacji użytkownika, można filtrować adnotacje pokazane na najwyższym poziomie, a tylko dodać dodatkowe adnotacje jako użytkownik powiększa?

Nawiasem mówiąc, uważam, że masz wyciek pamięci w kodzie jak pisał wyżej. Nawet jeśli nie chcesz korzystać z mechanizmu zdejmującą z kolejki, widok z wrócisz mapView:viewForAnnotation:należy autoreleased.

Odpowiedział 10/02/2010 o 16:28
źródło użytkownik

głosy
2

Myślę St3fan jest poprawna. W teorii można po prostu zachować dodawanie adnotacji do mapy i niech wyświetlacz widok uchwytu z nich, ale rzeczywistość jest taka, że ​​lepiej, jeśli trzymać odliczanie kawałek, 500 na ekranie naraz byłoby zbyt wiele, aby zobaczyć w każdym razie.

Jednak jest jeszcze jeden krok, aby spróbować - upewnij się, że wszystkie z widokiem adnotacji mają nieprzezroczystą ustawione na Tak tak:

annView.opaque = YES; 
Odpowiedział 08/02/2010 o 05:22
źródło użytkownik

głosy
1

Jeżeli nie jesteś usuwanie adnotacji nie widzianych przez użytkownika z myślą, że jest jedna rzecz do zrobienia za pomocą MKMapViewDelegate. Jeśli wydajność jest poniżające, gdy użytkownik Zoom-out do poziomu kraju może chcesz zaprezentować zagregowane informacje o poziomach powiększenia> Niektóre const wartość, na przykład zamiast 30 adnotacje w odległości 10 mil kwadratowych pokazują jak pojedynczy adnotację [30 something].

Odpowiedział 29/03/2010 o 15:09
źródło użytkownik

głosy
1

To brzmi dla mnie, że dodanie 500 punktów mapy do sekcji mapy wielkości ekranu iPhone nie ma sensu. Nie ma sposobu, można wyobrazić, że nawet kliknij prawym adnotacji.

Nie możesz spojrzeć na poziom powiększenia i centrum mapy, a następnie zdecydować się tylko dodać podzbiór adnotacji na mapie?

Chyba widziałem inne aplikacje to zrobić też.

Odpowiedział 08/02/2010 o 04:29
źródło użytkownik

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