绘制许多MKOverlay时的性能问题

时间:2012-02-16 23:10:18

标签: objective-c ios performance mapkit mkoverlay

当我使用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 个答案:

答案 0 :(得分:1)

你绝对可以获得这样的表现,但你可能需要创建自己的叠加视图。

在该视图中,您可以反复调用CGAddLineToPoint来绘制折线,同时使用CGMoveToPoint跳过部分。为每种颜色单独执行此操作,您就完成了。因此,如果你有两种颜色(红色+蓝色),你可以在你的多边形中循环两次,首先绘制红色(跳过蓝色部分),然后绘制蓝色(跳过红色部分)。