2011-10-31 33 views
7

在新發布的iOS 5.0 SDK中簡單地重新編譯我們的iPhone應用程序後,我遇到了奇怪的問題 - 所有UIImage:imageNamed(首次調用帶有實際圖像加載)和UIImage:imageWithContentsOfFile開始工作10比以前慢了很多倍。我設法縮小了問題:只有jpeg和png文件(不是gifs!)纔是這種情況,這不是因爲文件大小。甚至直接加載小32 * 32 PNG大約需要300毫秒......相比之下,舊設備上的30毫秒(使用完全相同的代碼在3.1和4.3.5上進行檢查)UIImage:imageWithContentsOfFile在iOS 5.0中慢了10倍

我還嘗試通過新引入的CIImage加載圖像,這個代碼

WLLog(@"Data loading..."); 
NSData *imageData = [NSData dataWithContentsOfFile:path]; 
WLLog(@"CIImage creation..."); 
CIImage* cii = [CIImage imageWithData:imageData]; 
WLLog(@"CIImage creation ok..."); 
float scle = 1.0; 
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 40000 
if ([[UIScreen mainScreen] respondsToSelector:@selector(scale)]) { 
    scle = [[UIScreen mainScreen] scale]; 
} 
#endif 
CIContext *context = [CIContext contextWithOptions:nil]; 
UIImage* res5 = [[UIImage alloc] init]; 
WLLog(@"UIImage creation..."); 
[res5 initWithCGImage:[context createCGImage:cii fromRect:cii.extent] scale:scle orientation:UIImageOrientationUp]; 
WLLog(@"Done!"); 

沒有任何的運氣......這一條線上

CIImage* cii = [CIImage imageWithData:imageData]; 

需要即使在小圖片(4KB PNG)相同的300毫秒。恕我直言,根本沒有什麼可以解析的!

有什麼可以解決加載時間這樣奇怪的變化?現在看起來在sdk內部有些變化很大:(

回答

8

。我遇到了同樣的問題,花了幾個小時才發現問題出在哪裏,我們的兩種情況看起來是完全一樣的:一箇舊的項目在iOS5上運行得並不順利, Ÿ更多。

所以我拿了Instrument的時間分析器,挖到我的應用程序的深度,只是爲了找出每次應用程序掛起時它實際上是在爲UIImageViews打開PNG文件的過程中,就像你發現的一樣。 但是我寫的其他應用程序沒有這個問題,並且我以同樣的方式做了所有事情。因此,根據您的經驗和我的其他應用運行良好來判斷,我認爲它必須與PNG文件本身有關。並猜測是什麼,結果證明我是對的。

因此,我坐下來寫了一個腳本,通過ImageMagick的convert將所有PNG文件傳送出去,然後刪除PNG(只是爲了好的措施),然後將臨時TGA轉換回PNG文件。這樣我就確信它們不僅不是由Photoshop創建的,而且也完全重寫了。

這樣做。現在一切順利,就像它在iOS 3和4上一樣。

我不確定它是否與Photoshop有關。其他應用程序,我最近用Photoshop製作的PNG工作得很好。所以也許這是一年前我幾乎用來創建這些PNG的Photoshop版本。或者只是覆蓋舊的圖像文件就夠了,我不確定。但現在它運行得很好。

我希望這有助於!

+0

謝謝,我一定會試一試,並在這裏發帖,如果有幫助。無論如何,似乎是一個錯誤對我來說(事情不是最好的新發布的5.0.1),我會立即將它提交給蘋果 – IPv6

+0

所以,你試過了嗎?它也與你一起工作嗎? - 我做了更多的測試,證實它與從磁盤讀取PNG有關。實際上,通過另一個Time Profiler跟蹤來判斷,我創建了讀取的PNG的元數據類時,iOS5已經失去了最大的時間。 – Martin

+0

太棒了!是的,這有助於很多,謝謝!並且你是對的 - 似乎元數據負責這個crazines(包括jpeg和png)。在沒有啓用元數據的情況下重新保存所有png和jpeg後,所有圖片開始像往常一樣工作 - 圖像以30ms加載。似乎像5.0之前版本的ios SDKs忽略了任何png/jpeg元數據 – IPv6

4

這很可能是一個bug。通過bug reporter向蘋果提交雷達。一定要把一個簡單的項目放在一起,清楚地顯示bug並附上它臭蟲報告 - 否則蘋果將在這裏向您發送電子郵件,要求一個

發表你的雷達#,以便其他人有類似的問題提交了類似的錯誤時,蘋果也可以引用#