iOS 圖片解碼最佳化

圖片顯示三步:載入->解碼->渲染

iOS 圖片解碼最佳化

圖片來自網路

在將磁碟的圖片渲染到螢幕之前,需要先得到圖片的原始畫素資料,才能執行後續的繪製操作,這也是為什麼需要對圖片進行壓縮的原因

什麼是解碼?

imageView。image=image;等號右邊的image作為資料來源,持有的資料是未解碼的壓縮資料,節省記憶體,加快儲存。當被賦值給imageView的image時,圖片資料會被解碼,變成RGB顏色資料。解碼是一個計算量較大的任務,需要CPU負責計算,並且解碼出來的圖片體積與圖片的寬高有關係,而與原圖片體積無關

iOS 圖片解碼最佳化

圖片來自網路

圖片解碼操作存在的問題?

以一個展示多圖片顯式功能的uitableview為例子,在上下滑動顯式圖片的過程中,不管是使用imageName,還是imageWithContentsOfFile,都會有載入圖片、解碼圖片、渲染圖片的動作(imageName只執行一次,再次顯示從快取中讀取),都相當於在主執行緒同時進行IO操作、解碼操作,會造成記憶體迅速增長和CPU負載瞬間提升。記憶體的增長會觸發系統的記憶體回收機制,系統會先嚐試去回收其他程序的記憶體,來滿足當前程序的使用,但是如果仍然無法滿足就會結束當前程序,我們看到的現象就是滑著滑動程式突然crash掉了。

如何對圖片解碼部分進行最佳化?

把解碼的過程放在子執行緒中進行,解碼完成回到主執行緒將圖片賦值給imageView的image屬性,並且快取起來。下次再插在相同圖片直接從快取中讀取就可以了。這種解碼最佳化的方式好多第三方已經實現,使用最多的就是SDWebImage。