Toubleshooting производительность MapKit

голоса
8

Я черчение более 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;
}

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

Задан 08/02/2010 в 03:12
источник пользователем
На других языках...                            


5 ответов

голоса
6

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]

Ответил 08/02/2010 в 06:48
источник пользователем

голоса
3

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

Ключи:

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

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

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

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

Ответил 10/02/2010 в 16:28
источник пользователем

голоса
2

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

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

annView.opaque = YES; 
Ответил 08/02/2010 в 05:22
источник пользователем

голоса
1

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

Ответил 29/03/2010 в 15:09
источник пользователем

голоса
1

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

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

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

Ответил 08/02/2010 в 04:29
источник пользователем

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