2010-02-08 20 views
8

Planuję ponad 500 punktów na mapie za pomocą zestawu mapkit. Powiększanie jest trochę nerwowe w porównaniu do natywnej aplikacji mapy google. Odkryłem, co powoduje powolność. Dodaję własne adnotacje, tak że mogę później dodać różne kolory pin i przyciski do widoków szczegółowych:Rozwiązywanie problemów z mapami wydajności

- (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 z powiększaniem/pomniejszaniem. Czy powinienem dodawać adnotacje inaczej, aby zwiększyć wydajność?

Odpowiedz

1

Wydaje mi się, że dodanie 500 punktów na mapie do części mapy, której rozmiar ekranu iPhone'a nie ma sensu. Nie ma możliwości, abyś mógł to sobie wyobrazić, a nawet kliknąć właściwą adnotację.

Nie możesz spojrzeć na poziom powiększenia i środek mapy, a następnie zdecydować się na dodanie tylko części adnotacji do mapy?

Wydaje mi się, że widziałem też inne aplikacje.

+0

Czy możesz wyjaśnić, w jaki sposób byłbyś w stanie dokonać tego rodzaju leniwego ładowania? – user230949

+1

MKMapView dostarcza wiadomości do swojego delegata za każdym razem, gdy mapa się przewija. Za każdym razem, gdy to się stanie, przechowuj delty szerokości i długości geograficznej widoku, aby znać sprzedaż mapy. Przed zapisaniem wartości należy sprawdzić, czy skala mapy urosła lub zmalała wystarczająco, aby dostosować liczbę adnotacji. Jeśli tak, po prostu wykonaj obliczenia poziomu szczegółowości. Przeprowadź listę adnotacji i połącz te, które znajdują się w pewnej odległości od siebie, w jedną nową adnotację reprezentującą wszystkie. Jeśli użytkownik ponownie się przybliży, zamień go na oryginalne adnotacje. – VictorB

2

Myślę, że St3fan ma rację. Teoretycznie możesz po prostu dodawać adnotacje do mapy i pozwolić, by widok ich wyświetlał, ale w rzeczywistości lepiej jest, jeśli odliczasz trochę, 500 na ekranie byłoby o wiele za dużo, żeby zobaczyć.

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

annView.opaque = YES; 
+0

Źle zrozumiesz pytanie. W obszarze wyświetlania nie ma 500 szpilek. Jest tylko kilka. Jeśli zmniejszysz odpowiednio odległość, w końcu zobaczysz wszystkie 500. annView.opaque = TAK nie pomogło. – user230949

+0

Następnie musisz kontrolować, o ile mapa wie od razu, po powiększeniu do miejsca, w którym niektóre nie są widoczne, musisz je usunąć. Właśnie dlatego mówiłem o tym, jak technicznie jest zbudowany, aby umożliwić ci to, co robisz - po prostu dodając wiele adnotacji, gdzie niektóre są poza ekranem - ale dla wydajności rzeczywistość polega na tym, że nie możesz mieć tylu adnotacji na mapie i mieć jej działanie cóż, więc musisz w pewnym stopniu zarządzać adnotacjami, o których mapa naprawdę wie. –

+0

OK, tak - zgadzam się. Ale jak mogę nimi zarządzać, więc wiem, które ładować, a których nie ładować? Wszystkie moje punkty są w tablicy. Jest z nimi coś, co mówi, że te punkty znajdują się w polu widzenia, ładują swoje adnotacje. Nie są, usuń ich adnotacje. – user230949

6

500 adnotacje jest prawdopodobnie zbyt wiele, ale nie tak wiele, że wydajność cierpi kiedy oglądasz tylko niektóre z nich. Jednak należy używać dequeueing z adnotacji w celu poprawy 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ż z 500 pinami, animacja kropla zajmuje dużo czasu, aby zakończyć. Powinieneś wyłączyć tę funkcję, korzystając z [view setAnimatesDrop:NO]

+2

Dzięki, ale pisząc nie pomaga żadnego wykonania. Mam świadomość, że duża liczba adnotacji powoduje spadek skuteczności. Mogę zmniejszyć do 100 i uzyskać dobrą wydajność. Kiedy zmienia się obszar wyświetlania mapy, potrzebuję sposobu na załadowanie adnotacji dla punktów, które pojawiają się. Potrzebujesz leniwego ładowania, ale mapkit nie jest przyjazny dla tego typu rzeczy. – user230949

+2

Rozwijanie numerów pomaga w osiąganiu wyników, dlaczego warto go użyć?"Ponowne użycie widoków adnotacji zapewnia znaczną poprawę wydajności podczas przewijania, unikając tworzenia nowych obiektów widoku podczas tej krytycznej operacji." http://developer.apple.com/iphone/library/documentation/MapKit/Reference/MKAnnotationView_Class/Reference/Reference.html –

3

Napisałem aplikację na telefon iPhone dla klienta i umieściliśmy lokalizator sklepu dla jednej z jego marek. Obejmuje on 501 lokalizacji, a podczas gdy animacja może być nieco nierówna, gdy użytkownik jest pomniejszony, aby zobaczyć całe Stany Zjednoczone, jest idealnie ograniczony do poziomu stanu, gdzie widoczna jest tylko garść pinezek.

Klucze:

  • powiększać użytkownik do ich aktualnego miejsca przed dodawać adnotacje.
  • Ponownie użyj widoków adnotacji, używając dequeueReusableAnnotationViewWithIdentifier:.

Aby uzyskać pierwszy punkt, należy włączyć aktualizacje lokalizacji i ustawić flagę, gdy otrzymasz pierwszą. Zobrazuj mapę do tej lokalizacji, używając zakresu regionu, który ma sens dla Twojej aplikacji, a następnie sprawdź w mapView:regionDidChangeAnimated:, czy nadal musisz dodać swoje adnotacje i, czy bieżąca lokalizacja została zaktualizowana, zanim zadzwonisz pod numer addAnnotation:.

Jeśli nie możesz lub nie chcesz powiększać lokalizacji użytkownika, czy możesz filtrować adnotacje wyświetlane na najwyższym poziomie i dodawać tylko dodatkowe adnotacje przy powiększaniu przez użytkownika?

Przy okazji, wydaje mi się, że masz wyciek pamięci w kodzie, jak opisano powyżej.Nawet jeśli nie chcesz korzystać z mechanizmu usuwania, widok, który powrócisz z mapView:viewForAnnotation:, powinien zostać autoreleased.

1

Jeśli nie usuniesz adnotacji niewidocznych dla użytkownika z widoku, jedną rzecz należy wykonać za pomocą MKMapViewDelegate. Jeśli wydajność zmniejsza się po zmniejszeniu użytkownika do poziomu kraju, możesz chcieć przedstawić zagregowane informacje na temat poziomów powiększenia> niektórych wartości stałych, np. zamiast 30 adnotacji w promieniu 10 mil kwadratowych wyświetlana jest pojedyncza adnotacja, taka jak [30 something].

Powiązane problemy