2013-08-20 125 views
0

我试图加快在我的应用程序中绘制地图图块的速度,因为Time Profiler说这是应用程序运行速度最慢的地方。该项目文件是here,以及一部分时间探查说是最慢的是drawMapRect的这一部分:zoomScale:为overlay--在覆盖图中绘制更快的地图图块

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和缩放瓷砖inContext的方法他们正在减慢最多的东西。有什么办法可以加快速度,或将绘图移动到后台线程? (尽管无论如何都不会在后台线程中绘制MapRect,因为它不会停止每次应用程序加载图块时的地图滚动)

回答

1

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

+0

感谢TheStreaker。这回答了我能理解的最好的问题。我会尝试使用“imageNamed:”方法,但最终我只需要优化代码的其他部分以弥补绘制地图图块花费的时间。到目前为止,我已经减少了其他方法花费的时间,并且在我的手机上测试应用程序时似乎有所帮助。 – guthook

1

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