Fresco 與 Picasso 、Glide 的比較

比較Picasso、Glide 和 Fresco 三種圖片加載庫


比較 Picasso 與 Glide


總體來說二者極爲相似,有着近乎相同的 API 的使用風格,但 Glide 在緩存策略和加載 gif 方面略勝一籌。


基礎


Glide 和 Picasso 非常相似,Glide 加載圖片的方式和 Picasso 如出一轍。
雖然兩者看起來一樣,但 Glide 更易用,因爲 Glide 的 with 方法不光接受 Context,還接受 Activity 和 Fragment,Context 會自動的從他們獲取,同時將 Activity/Fragment 作爲 with()參數的好處是:圖片加載會和 Activity/Fragment 的生命週期保持一致,比如 Paused 狀態在暫停加載,在 Resumed 的時候又自動重新加載。


圖像和內存


同樣將 1920×1080 像素的圖片加載到 768×432 的 ImageView 中,Glide 加載的圖片質量要差於Picasso,這是因爲 Glide 默認的 Bitmap 格式是 RGB-565 ,比 ARGB-8888 格式的內存開銷要小一半。想要提高 Glide 的圖片效果,可以創建一個新的 GlideModule 將 Bitmap 格式轉換到 ARGB-8888。同時在 AndroidManifest.xml 中將 GlideModule 定義爲 meta-data。
修改了 Bitmap 格式後,Glide 將花費兩倍於上次的內存,但是仍遠遠小於 Picasso 的內存開銷,原因在於 Picasso 是加載了全尺寸的圖片到內存,然後讓 GPU 來實時重繪大小。而 Glide 加載的大小和 ImageView 的大小是一致的,當然,Picasso 也是可以指定加載圖片大小的,但是問題在於你需要主動計算 ImageView 的大小,或者說你的 ImageView 大小是具體的值(而不是 wrap_content )
在加載圖片這個問題上 Glide 完勝 Picasso,因爲 Glide 可以自動計算出任意情況下的 ImageView 大小。

Image質量的細節


將 ImageView 還原到真實大小時,Glide 加載的圖片沒有 Picasso 那麼平滑。


磁盤緩存


Picasso 和 Glide 在磁盤緩存策略上有很大的不同。Picasso 緩存的是全尺寸的,而 Glide 緩存的是跟 ImageView 尺寸相同的。我們可以將 ImageView 調整成不同大小,但不管大小如何 Picasso 只緩存一個全尺寸的。Glide 則不同,它會爲每種大小的 ImageView 緩存 一次。儘管一張圖片已經緩存了一次,但是假如你要在另外一個地方再次以不同尺寸顯示,需要重新下載,調整成新尺寸的大小,然後將這個尺寸的也緩存起來。具體說來就是:假如在第一個頁面有一個 200×200 的 ImageView,在第二個頁面有一個 100×100 的 ImageView,這兩個 ImageView 本來是要顯示同一張圖片,卻需要下載兩次。不過,你可以通過代碼改變這種行爲,讓Glide既緩存全尺寸又緩存其他尺寸,
這樣就使得下次在任何 ImageView 中加載圖片的時候,全尺寸的圖片將從緩存中取出,重新調整大小,然後緩存。
Glide 的這種方式優點是加載顯示非常快。而 Picasso 的方式則因爲需要在顯示之前重新調整大小而導致一些延遲。不過 Glide 比 Picasso 需要更大的空間來緩存。

特性

Glide 可以做到和 Picasso 幾乎一樣多的事,代碼也幾乎一樣。但 Glide 可以加載 GIF 動態圖,而 Picasso 不能,但是 Glide 動畫會消費太多的內存,因此謹慎使用。除了 gif 動畫之外,Glide 還可以將任何的本地視頻解碼成一張靜態圖片。還有一個特性是你可以配置圖片顯示的動畫,而 Picasso 只有一種動畫:fading in,最後一個是可以使用 thumbnail()產生一個你所加載圖片的 thumbnail。其實還有一些特性,不過不是非常重要,比如將圖像轉換成字節數組等。


Fresco

內存管理

Fresco 的最大亮點在於它的內存管理。解壓後的圖片,即 Android 中的 Bitmap ,佔用大量的內存,在 Android 5.0以下系統中,這會顯著地引發界面卡頓。而使用 Fresco 將很好地解決這個問題,Fresco 會將圖片放到一個特別的內存區域,當圖片不再顯示的時候,佔用的內存會自動被釋放,這會使得 APP 更流暢,減少因圖片內存佔用而引發的 OOM。當 APP 包含的圖片較多時,這個效果尤其明顯。

圖像


Fresco 支持圖像的漸進式呈現,漸進式的圖片格式先呈現大致的圖片輪廓,然後隨着圖片下載的繼續,逐漸呈現清晰的圖片,這在低網速情況下瀏覽圖片十分有幫助,可以帶來更好地用戶體驗。另外,Fresco 支持加載 gif 圖,支持 WebP 格式。


最後總結

 ImageLoader 優點



(1) 支持下載進度監聽

 

(2) 可以在 View 滾動中暫停圖片加載
通過 PauseOnScrollListener 接口可以在 View 滾動中暫停圖片加載。

 

(3) 默認實現多種內存緩存算法 這幾個圖片緩存都可以配置緩存算法,不過 ImageLoader 默認實現了較多緩存算法,如 Size 最大先刪除、使用最少先刪除、最近最少使用、先進先刪除、時間最長先刪除等。

 

(4) 支持本地緩存文件名規則定義




Picasso 優點



(1) 自帶統計監控功能
支持圖片緩存使用的監控,包括緩存命中率、已使用內存大小、節省的流量等。

 

(2) 支持優先級處理
每次任務調度前會選擇優先級高的任務,比如 App 頁面中 Banner 的優先級高於 Icon 時就很適用。

 

(3) 支持延遲到圖片尺寸計算完成加載

 

(4) 支持飛行模式、併發線程數根據網絡類型而變
手機切換到飛行模式或網絡類型變換時會自動調整線程池最大併發數,比如 wifi 最大併發爲 4, 4g 爲 3,3g 爲 2。
這裏 Picasso 根據網絡類型來決定最大併發數,而不是 CPU 核數。

 

(5) “無”本地緩存
無”本地緩存,不是說沒有本地緩存,而是 Picasso 自己沒有實現,交給了 Square 的另外一個網絡庫 okhttp 去實現,這樣的好處是可以通過請求 Response Header 中的 Cache-Control 及 Expired 控制圖片的過期時間。




 Glide 優點


(1) 圖片緩存->媒體緩存
Glide 不僅是一個圖片緩存,它支持 Gif、WebP、縮略圖。甚至是 Video,所以更該當做一個媒體緩存。

 

(2) 支持優先級處理

 

(3) 與 Activity/Fragment 生命週期一致,支持 trimMemory
Glide 對每個 context 都保持一個 RequestManager,通過 FragmentTransaction 保持與 Activity/Fragment 生命週期一致,並且有對應的 trimMemory 接口實現可供調用。

 

(4) 支持 okhttp、Volley
Glide 默認通過 UrlConnection 獲取數據,可以配合 okhttp 或是 Volley 使用。實際 ImageLoader、Picasso 也都支持 okhttp、Volley。

 

(5) 內存友好
① Glide 的內存緩存有個 active 的設計
從內存緩存中取數據時,不像一般的實現用 get,而是用 remove,再將這個緩存數據放到一個 value 爲軟引用的 activeResources map 中,並計數引用數,在圖片加載完成後進行判斷,如果引用計數爲空則回收掉。

 

② 內存緩存更小圖片
Glide 以 url、view_width、view_height、屏幕的分辨率等做爲聯合 key,將處理後的圖片緩存在內存緩存中,而不是原始圖片以節省大小

 

③ 與 Activity/Fragment 生命週期一致,支持 trimMemory

 

④ 圖片默認使用默認 RGB_565 而不是 ARGB_888
雖然清晰度差些,但圖片更小,也可配置到 ARGB_888。

 

其他:Glide 可以通過 signature 或不使用本地緩存支持 url 過期



Picasso 所能實現的功能 Glide 都能做到,只是所需設置不同。兩者的區別是 Picasso 比 Glide 體積小很多且圖像質量比 Glide 高,但Glide 的速度比 Picasso 更快,Glide 的長處是處理大型的圖片流,如 gif、video,如果要製作視頻類應用,Glide 當爲首選。
Fresco 可以說是綜合了之前圖片加載庫的優點,其在5.0以下的內存優化非常好,但它的不足是體積太大,按體積進行比較:Fresco>Glide>Picasso,所以 Fresco 在圖片較多的應用中更能凸顯其價值,如果應用沒有太多圖片需求,不推薦使用 Fresco。

發佈了31 篇原創文章 · 獲贊 13 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章