我正试图加快我的应用程序中地图块的绘制速度,因为Profiler说这是应用程序运行速度最慢的地方。项目文件是这里,时间分析器说的最慢的部分是project :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不会在后台线程中发生,因为它不会在应用程序每次加载瓷砖时停止地图滚动)
发布于 2013-08-21 04:15:20
是的,drawMapRect已经在多个线程上运行,直接从后台线程调用任何绘图代码都是错误的做法,不会提高速度或响应能力。代码中的瓶颈很可能是绘图函数CGContextDrawImage,如果您已经确定只绘制与传递到drawMapRect:的mapRect相交的绘图块,那么您可能无法做太多的事情。然而,您正在从多个线程中反复调用UIImage的方法imageWithContentsOfFile,我不认为这会像imageNamed:方法那样缓存图像数据。解决这个问题可能会加快速度。然而,根据我的经验,如果分析器告诉您它正在将大部分时间用于drawMapRect:方法,您就不应该感到恐慌。因为它被取消了主线程,而且地图仍然响应用户交互,所以优化它通常不会大大改善用户的体验。
发布于 2013-08-20 15:55:42
不确定它是否会更快,但如果您处理多个瓷砖,则可以尝试并行化操作。如果您需要在tilesInRect中偏移和/或裁剪许多块,您可以使用Grand Central Dispatch或NSOperationQueue同时执行多个这样的操作,然后进行最后的组装步骤。
https://stackoverflow.com/questions/18334363
复制相似问题