我正在尝试加快应用程序中地图瓷砖的绘制速度,因为Time Profiler表示这是应用程序运行最慢的地方。项目文件为here,并且时间剖析器认为最慢的部分是tile叠加层的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);
    }
}


我猜想使用任何UIImage并对它们进行缩放是最慢的事情。有什么办法可以加快速度,或将图形移到后台线程吗? (尽管无论如何都不在后台线程中执行drawMapRect,因为它不会在应用每次加载图块时停止地图滚动)

最佳答案

是的,drawMapRect已经在多个线程上运行,并且直接从后台线程调用任何图形代码是不好的做法,不会提高速度或响应速度。代码中的瓶颈很可能是绘图功能CGContextDrawImage,如果您已经确定只绘制与传递到drawMapRect:的mapRect相交的图块,则可能无法做很多事情。但是,您正在从多个线程中反复调用UIImage的方法imageWithContentsOfFile,我不认为这会像imageNamed:方法那样缓存图像数据。解决此问题可能会提高速度。但是根据我的经验,如果事件探查器告诉您它大部分时间都花在了drawMapRect:方法上,则不会感到惊慌。由于它已从主线程中退出,并且地图仍然可以响应用户交互,因此对其进行优化通常并不能极大地改善用户的体验。

关于ios - 更快地绘制叠加层中的 map 图块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/18334363/

10-09 09:57