【问题标题】:Performance issues when drawing many MKOverlays绘制许多 MKOverlay 时的性能问题
【发布时间】:2012-02-16 23:10:17
【问题描述】:

当我使用 MKOverlays 绘制路径(有时使用 5000 多个单独的 MKPolylines)时,要等待很长时间才能绘制所有覆盖,并且每次将地图视图滚动到新区域时,覆盖必须绘制该区域,并且还有另一个明显的冻结。

我的困境是我有两组代码,它们都正确地绘制了路径。第一个将路径绘制为一条长线,并且绘制速度非常快。第二个将每个线段绘制为单独的线,并且需要很长时间。

现在,我为什么还要考虑第二种方式?因为我必须分析每条线以查看该线应该是什么颜色。例如,如果线条的title 属性为“red”,那么我将线条设为红色,但如果它是“blue”,则线条为蓝色。使用第一种技术,这种特异性是不可能的(据我所知,但也许其他人知道不同?)因为路径只是一条大线,并且访问每个单独的段是不可能的。第二种方法很容易,但需要很长时间。

这是我的两组代码:

第一种方式(速度快但无法访问个别细分市场):

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];

我的问题是:我能否通过第二种方式为我提供的对每一行的控制来获得第一种方式的性能?

【问题讨论】:

    标签: objective-c ios performance mapkit mkoverlay


    【解决方案1】:

    您肯定可以获得这样的性能,但您可能需要创建自己的叠加视图。

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

    【讨论】:

    • 这有点超出了简单的 SO 答案的范围。从阅读文档开始。您需要创建一个MKOverlayView 子类,其中有一个-(void)drawMapRect:(MKMapRect)mapRect zoomScale:(MKZoomScale)zoomScale inContext:(CGContextRef)context 进行绘图。从那里你可以绘制你的折线。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-08
    • 2013-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多