我正在尝试加快应用程序中地图瓷砖的绘制速度,因为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/