在叠加层中更快地绘制地图图块

时间:2013-08-20 11:55:03

标签: ios mapkit

我正在尝试加速在我的应用中绘制地图图块,因为Time Profiler说应用程序以最慢的速度运行。项目文件是here,而Time Profiler所说的部分是最慢的部分是drawMapRect的一部分:zoomScale:用于图块叠加的inContext方法 -

for (ImageTile *tile in tilesInRect) {
    CGRect rect = [self rectForMapRect:tile.frame];

    NSString *path = tile.imagePath;
    if (path) {
        UIImage *image = [UIImage imageWithContentsOfFile:path];

        CGContextSaveGState(context);
        CGContextTranslateCTM(context, CGRectGetMinX(rect), CGRectGetMinY(rect));

        float scale = (overZoom/zoomScale);

        CGContextScaleCTM(context, scale, scale);
        CGContextTranslateCTM(context, 0, image.size.height);
        CGContextScaleCTM(context, 1, -1);
        CGContextDrawImage(context, CGRectMake(0, 0, image.size.width, image.size.height), [image CGImage]);
        CGContextRestoreGState(context);
    }
}

我猜测使用任何UIImages并缩放它们会让事情变得更加缓慢。有没有办法加快速度,或将绘图移动到后台线程? (尽管drawMapRect无论如何都会在后台线程中发生,因为每次应用程序加载一个tile时它都不会停止地图滚动)

2 个答案:

答案 0 :(得分:1)

不确定它是否会更快,但如果您正在处理多个切片,则可以尝试并行化操作。如果您需要在tilesInRect中偏移和/或裁剪多个图块,您可以使用Grand Central Dispatch或NSOperationQueue同时执行多个图块,然后进行最后的装配步骤。

答案 1 :(得分:1)

是的,drawMapRect已经在多个线程上运行,直接从后台线程调用任何绘图代码是不好的做法,不会提高速度或响应速度。代码中的瓶颈很可能是绘图函数CGContextDrawImage,如果您已经确定只绘制了与传递到drawMapRect:的mapRect相交的切片,则可能无法做很多事情。但是,您从多个线程重复调用UIImage的方法imageWithContentsOfFile,我不相信这会像imageNamed:方法那样缓存图像数据。您可能会发现修复此问题会加快速度。但是根据我的经验,如果分析器告诉您它大部分时间花在drawMapRect:方法上,您不应该感到惊慌。由于它被称为主线程并且地图仍然响应用户交互,因此优化它通常不会极大地改善用户的体验。