我正在尝试加速在我的应用中绘制地图图块,因为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时它都不会停止地图滚动)
答案 0 :(得分:1)
不确定它是否会更快,但如果您正在处理多个切片,则可以尝试并行化操作。如果您需要在tilesInRect
中偏移和/或裁剪多个图块,您可以使用Grand Central Dispatch或NSOperationQueue
同时执行多个图块,然后进行最后的装配步骤。
答案 1 :(得分:1)
是的,drawMapRect
已经在多个线程上运行,直接从后台线程调用任何绘图代码是不好的做法,不会提高速度或响应速度。代码中的瓶颈很可能是绘图函数CGContextDrawImage
,如果您已经确定只绘制了与传递到drawMapRect:
的mapRect相交的切片,则可能无法做很多事情。但是,您从多个线程重复调用UIImage
的方法imageWithContentsOfFile
,我不相信这会像imageNamed:
方法那样缓存图像数据。您可能会发现修复此问题会加快速度。但是根据我的经验,如果分析器告诉您它大部分时间花在drawMapRect:
方法上,您不应该感到惊慌。由于它被称为主线程并且地图仍然响应用户交互,因此优化它通常不会极大地改善用户的体验。