Двойная производительность картографического набора - PullRequest
8 голосов
/ 08 февраля 2010

Я строю более 500 точек на карте, используя mapkit. Масштабирование немного нервное по сравнению с нативным приложением Google Map. Я обнаружил, что вызывает медлительность. Я добавляю пользовательские аннотации, чтобы потом можно было добавлять разные цвета выводов и кнопки для подробных видов:

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

Если я закомментирую приведенный выше код, все работает нормально. Очень плавный с увеличением / уменьшением. Стоит ли добавлять аннотации по-другому, чтобы повысить производительность?

Ответы [ 5 ]

6 голосов
/ 08 февраля 2010

500 аннотаций, вероятно, слишком много, но не так много, что производительность страдает, когда вы просматриваете только некоторые из них. Тем не менее, вы должны использовать снятие очереди с аннотациями для повышения производительности

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

Кроме того, при 500 пинах анимация выпадения занимает много времени. Вы должны отключить это с [view setAnimatesDrop:NO]

3 голосов
/ 10 февраля 2010

Я написал приложение для iPhone для клиента, и мы включили локатор магазина для одного из брендов этого магазина. Он включает в себя 501 местоположение, и хотя анимация может быть немного прерывистой, когда вы уменьшаете масштаб для просмотра всей территории Соединенных Штатов, она прекрасно масштабируется до уровня штата, где видна лишь небольшая часть выводов.

Ключи:

  • Перед добавлением аннотаций масштабируйте пользователя в его текущем местоположении.
  • Повторное использование аннотаций с использованием dequeueReusableAnnotationViewWithIdentifier:.

Чтобы достичь первого пункта, вам нужно включить обновления местоположения и установить флаг, когда вы получите первый. Анимируйте карту к этому местоположению, используя диапазон областей, который имеет смысл для вашего приложения, затем в mapView:regionDidChangeAnimated: проверьте, нужно ли добавлять аннотации и , что текущее местоположение было обновлено перед вами. Звоните addAnnotation:.

Если вы не можете или не хотите увеличивать местоположение пользователя, можете ли вы отфильтровать аннотации, показанные на самом высоком уровне, и добавлять дополнительные аннотации только по мере увеличения масштаба пользователя?

Кстати, я полагаю, у вас есть утечка памяти в вашем коде, как указано выше. Даже если вы не хотите использовать механизм удаления из очереди, представление, которое вы возвращаете из mapView:viewForAnnotation:, должно быть автоматически освобождено.

2 голосов
/ 08 февраля 2010

Я думаю, что St3fan правильно. Теоретически вы можете просто добавлять аннотации на карту и позволять представлению обрабатывать их отображение, но реальность такова, что было бы лучше, если бы вы немного сократили счет, 500 на экране сразу было бы слишком много, чтобы их было видно в любом случае.

Однако есть еще один шаг - убедитесь, что для всех видов аннотаций установлено непрозрачное значение YES, например:

annView.opaque = YES; 
1 голос
/ 29 марта 2010

Если вы не удаляете аннотации, не видимые пользователем, из представления, это одна вещь, которую нужно сделать с помощью MKMapViewDelegate. Если при снижении пользователя до уровня страны производительность снижается, вы можете представить агрегированную информацию об уровнях масштабирования> некоторое постоянное значение, например, вместо 30 аннотаций в пределах 10 квадратных миль отображается одна аннотация, например [30 something].

1 голос
/ 08 февраля 2010

Мне кажется, что добавлять 500 точек карты к участку карты размером с экран iPhone не имеет смысла. Вы не сможете визуализировать это или даже щелкнуть правой аннотацией.

Разве вы не можете посмотреть на уровень масштабирования и центр карты, а затем решить добавить на карту только подмножество комментариев?

Мне кажется, я видел, что другие приложения тоже это делают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...