問題引言
近來使用SDWebImage獲取網(wǎng)絡(luò)gif圖片時,發(fā)現(xiàn)內(nèi)存猛增。如若再tableview中加載多張gif圖片,很快就有內(nèi)存警告出現(xiàn),隨之程序被系統(tǒng)kill。(如圖1所示,原本不到1M的gif,程序運行后,內(nèi)存占用了78.6M,但是cpu占用很低)

后來發(fā)現(xiàn)網(wǎng)絡(luò)上流行的開源庫YYKit,據(jù)說對圖片處理的很好,就下載下來與SDWebImage進行了對比,發(fā)現(xiàn):相比于SDWebImage,YYKit的內(nèi)存使用的確是降低了,可是在cpu使用上面,居高不下。(如圖2所示,同樣的gif圖片,程序運行后,內(nèi)存占用只有10.3M,但是cpu持續(xù)占用)

這到底是為什么呢,我們來分析一下看看。
問題分析
首先,先看看SDWebImage運行過程中內(nèi)存占用過高的問題。
通過instrucment分析,發(fā)現(xiàn)SDWebImage處理gif圖片的方法是:將gif資源中每一張imgae寫入到內(nèi)存中,通過animatedImageWithImages的方式播放動畫。這樣的好處是,gif輪詢播放時,直接從內(nèi)存中取資源就好了,降低了cpu的占用。也就是說,SDWebImage是以空間換取的流暢度。

問題就在這里了,每張image占用內(nèi)存1.2M,所以此gif中包含58張image,就會占用近70M的內(nèi)存。當(dāng)程序中的gif多了,就會出現(xiàn)內(nèi)存警告。
然后,再來看看YYKit的cpu使用問題。
也是通過instrument分析,發(fā)現(xiàn)了YYKit處理gif圖片的方法是:每次從緩存的gif中,讀取當(dāng)前需要展示的image,進行動畫展示。這樣做的好處是,不用為gif的每張image開辟空間了,每次都是從一份gif資源中讀取一張image就好了。

那這個YYKit的cpu問題,也就不言而喻了,以一定的幀率從緩沖中解析出當(dāng)前需要展示的image,肯定是需要耗用cpu的。
小結(jié)
問題分析也就到這里了,兩個開源庫各有特點,具體使用哪個,需要根據(jù)不同的業(yè)務(wù)需求決定。