2013-08-20 122 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同時完成多個圖塊,然後進行最後的組裝步驟。