過去的幾年裏,iOS 應用在視覺方面愈來愈吸引人。圖像展現是其中很關鍵的部分,由於大部分圖像展現都須要下載而且渲染。大部分開發者都要使用圖像填充表格視圖(table views)或者集合視圖(collection views)。下載圖片消耗一些資源(如蜂窩數據、電池以及 CPU 等)。爲了減小資源消耗,一些緩存模型也應運而生。html
爲了得到良好的用戶體驗,當咱們緩存和加載圖像時,瞭解 iOS 底層如何處理是很重要的。此外,大多數使用了圖片緩存的開源庫也是個不錯解決方案。ios
// 假設咱們有一個 NSURL *imageUrl and UIImageView *imageView, 咱們須要經過NSURL下載圖片並在UIImageview上展現 if ([self hasImageDataForURL:imageUrl] { NSData *data = [self imageDataForUrl:imageUrl]; UIImage *image = [UIImage imageWithData:imageData]; dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = image; }); } else { [self downloadImageFromURL:imageUrl withCompletion:^(NSData *imageData, …) { [self storeImageData:imageData …]; UIImage *image = [UIImage imageWithData:imageData]; dispatch_async(dispatch_get_main_queue(), ^{ imageView.image = image; }); }]; }
FPS 簡介git
layer contents
的圖像進行拷貝。 拷貝圖像包含如下過程:github
字節位沒有正確對齊的圖像將被 CoreAnimation 拷貝,以修復字節位對齊並使之能被渲染。這一點在 Apple 文檔裏沒有說明,可是使用 Instruments 代表 CA::Render::copy_image
會執行此操做,即便 Core Aniation 即便沒有拷貝圖像。web
從 iOS7 開始,第三方應用不能使用JPEG硬件解碼器。這意味着咱們只能使用慢不少的軟解碼器。這一點在 FastImageCache 團隊的 GitHub 主頁以及 Nick Lockwood 的推文上都有指出。vim
更多的成像相關以及 SDK 框架(CoreGraphics, ImageIO, CoreAnimation, CoreImage)工做原理,CPU vs GPU 等,請閱讀 @rsebbe 的文章:Advanced Imaging on iOS緩存
這有一篇文章--CoreData 對比 File System,實現圖像緩存的基準測試,結果 File System 的表現更好。app
看一看上面羅列的觀點,本身實現圖像緩存不只複雜,耗時並且痛苦。這也是爲何我傾向於使用開源的圖像緩存解決方案,大家大部分已經據說過 SDWebImage 或 new FastImageCache。框架
爲了讓你知道哪一個開源庫最適合你,我作了測試而且分析它們如何知足上述要求。異步
測試庫:
注:AFNetworking 加入對比是因爲其自iOS7後在磁盤緩存方面出色的表現(基於 NSURLCache 實現)
對於每一個庫,我都會使用全新的測試app,而後啓動app,等全部圖像加載完後,慢慢滑動。而後以不一樣力度來回滑動(從慢到快)。接着關掉app強制應用從磁盤緩存中加載圖像,最後重複以上測試場景。
相關 demo 能夠在 GitHub 找到並獲取,名字是 ImageCachingBenchmark,同時還有本次實驗的圖表、結果數據表以及更多。
請注意,請注意 GitHub 上的工程和圖像緩存庫都須要作一些調整,以便能讓咱們看到每一張緩存的圖片都可以被加載出來。因爲我不想檢查 Cocoapods 源碼文件(不是個好習慣),因此須要對 Cocoapods clean 後從新編譯工程代碼,目前 GitHub 上的版本與我作測試的版本有些差異。
若是大家想從新跑一下測試,你須要編寫相同 completionBlock 用於圖像加載,全部庫得要跟默認的 SDWebImage 同樣返回 SDImageCacheType。
在 GitHub 工程上能看到完整的基準測試結果,因爲這些表格很大,我只使用運行最快的設備 iPhone 5s 和運行最慢的 iPhone 4 來測試。
彙總:
表格名詞解釋:
從頭開始編寫 iOS 圖像緩存組件很困難
SDWebImage 和 AFNetworking 是穩定的工程。因爲有不少貢獻者,這樣保證代碼可以及時獲得維護,FastImageCache 在維護方面更新很快。
基於以上全部數據,我認爲 SDWebImage 在目前是一個很好的解決方案。即便有些工程使用 AFNetworking 或 FastImageCache 更好,可是這些都依賴於項目需求。
原文:iOS image caching. Libraries benchmark (SDWebImage vs FastImageCache)
譯者:夜微眠
校對:藍魂、Cocoa
首發 CocoaChina