0

我正在尝试加快在我的应用程序中绘制地图图块的速度,因为 Time Profiler 说这是应用程序运行速度最慢的地方。项目文件在这里,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无论如何都不会发生在后台线程中,因为它不会在每次应用程序加载图块时停止地图滚动)

4

2 回答 2

1

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

于 2013-08-21T04:15:20.683 回答
1

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

于 2013-08-20T15:55:42.053 回答