Проблемы с производительностью при рисовании многих MKOverlays - PullRequest
1 голос
/ 17 февраля 2012

Когда я рисую путь с помощью MKOverlays (иногда с 5000+ отдельными MKPolylines), очень долго ждут, когда будут нарисованы все наложения, и каждый раз, когда вид карты прокручивается в новую область, наложения дляэта область должна быть нарисована, и есть еще одно заметное замораживание.

Моя дилемма в том, что у меня есть два набора кода, которые оба правильно рисуют путь.Первый рисует путь одной длинной линией и рисует очень быстро.Второй рисует каждый отрезок как отдельную линию и занимает много времени.

Теперь, почему я бы даже подумал о втором способе?Потому что я должен проанализировать каждую отдельную линию, чтобы увидеть, каким должен быть цвет линии.Например, если свойство строки title имеет значение «красный», я делаю линию красной, но если она «синяя», то линия синяя.С первой техникой такая специфика невозможна (насколько я знаю, но, может быть, кто-то другой знает по-другому?), Потому что путь - это только одна большая линия, и доступ к каждому отдельному сегменту невозможен.Со вторым способом это легко, но просто занимает много времени.

Вот мои два набора кода:

Первый способ (быстрый, но не может получить доступ к отдельным сегментам):

CLLocationCoordinate2D coords[sizeOverlayLat];

for(int iii = 0; iii < sizeOverlayLat; iii++) {
    coords[iii].latitude = [[overlayLat objectAtIndex:iii] doubleValue];
    coords[iii].longitude = [[overlayLong objectAtIndex:iii] doubleValue];
}

MKPolyline* line = [MKPolyline polylineWithCoordinates:coords count:sizeOverlayLat];

[mapViewGlobal addOverlay:line];

Второй способ (медленно, но я могу нарисовать каждую линию определенным цветом):

NSMutableArray* lines = [NSMutableArray new];

for(int idx = 1; idx < sizeOverlayLat; idx++) {
    CLLocationCoordinate2D coords[2];
    coords[0].latitude = [[overlayLat objectAtIndex:(idx - 1)] doubleValue];
    coords[0].longitude = [[overlayLong objectAtIndex:(idx - 1)] doubleValue];

    coords[1].latitude = [[overlayLat objectAtIndex:idx] doubleValue];
    coords[1].longitude = [[overlayLong objectAtIndex:idx] doubleValue];

    MKPolyline* line = [MKPolyline polylineWithCoordinates:coords count:2];
    [line setTitle:[overlayColors objectAtIndex:idx]];
    [lines addObject:line];
}

[mapViewGlobal addOverlays:lines];

Мой вопрос: могу ли я получить производительность первого способа сконтроль над каждой линией, что мне предоставляет второй способ?

1 Ответ

1 голос
/ 17 февраля 2012

Вы, безусловно, можете получить такую ​​производительность, но вам, вероятно, потребуется создать собственный вид наложения.

В этом представлении вы можете рисовать полилинии, вызывая CGAddLineToPoint несколько раз, пропуская детали с помощью CGMoveToPoint. Сделайте это отдельно для каждого цвета, и все готово. Таким образом, если у вас есть 2 цвета (красный + синий), вы должны дважды перебрать свой полигон, сначала рисуя красный (пропуская синие фигуры), а затем рисуя синий (пропуская красные).

...