問(wèn)題引言
近來(lái)使用SDWebImage獲取網(wǎng)絡(luò)gif圖片時(shí),發(fā)現(xiàn)內(nèi)存猛增罢猪。如若再tableview中加載多張gif圖片捕虽,很快就有內(nèi)存警告出現(xiàn),隨之程序被系統(tǒng)kill坡脐。(如圖1所示泄私,原本不到1M的gif,程序運(yùn)行后备闲,內(nèi)存占用了78.6M晌端,但是cpu占用很低)
后來(lái)發(fā)現(xiàn)網(wǎng)絡(luò)上流行的開源庫(kù)YYKit,據(jù)說(shuō)對(duì)圖片處理的很好恬砂,就下載下來(lái)與SDWebImage進(jìn)行了對(duì)比咧纠,發(fā)現(xiàn):相比于SDWebImage,YYKit的內(nèi)存使用的確是降低了泻骤,可是在cpu使用上面漆羔,居高不下。(如圖2所示狱掂,同樣的gif圖片演痒,程序運(yùn)行后,內(nèi)存占用只有10.3M趋惨,但是cpu持續(xù)占用)
這到底是為什么呢鸟顺,我們來(lái)分析一下看看。
問(wèn)題分析
首先器虾,先看看SDWebImage運(yùn)行過(guò)程中內(nèi)存占用過(guò)高的問(wèn)題讯嫂。
通過(guò)instrucment分析,發(fā)現(xiàn)SDWebImage處理gif圖片的方法是:將gif資源中每一張imgae寫入到內(nèi)存中兆沙,通過(guò)animatedImageWithImages的方式播放動(dòng)畫欧芽。這樣的好處是,gif輪詢播放時(shí)葛圃,直接從內(nèi)存中取資源就好了千扔,降低了cpu的占用。也就是說(shuō)装悲,SDWebImage是以空間換取的流暢度昏鹃。
問(wèn)題就在這里了,每張image占用內(nèi)存1.2M诀诊,所以此gif中包含58張image洞渤,就會(huì)占用近70M的內(nèi)存。當(dāng)程序中的gif多了属瓣,就會(huì)出現(xiàn)內(nèi)存警告载迄。
然后讯柔,再來(lái)看看YYKit的cpu使用問(wèn)題。
也是通過(guò)instrument分析护昧,發(fā)現(xiàn)了YYKit處理gif圖片的方法是:每次從緩存的gif中魂迄,讀取當(dāng)前需要展示的image,進(jìn)行動(dòng)畫展示惋耙。這樣做的好處是捣炬,不用為gif的每張image開辟空間了,每次都是從一份gif資源中讀取一張image就好了绽榛。
那這個(gè)YYKit的cpu問(wèn)題湿酸,也就不言而喻了,以一定的幀率從緩沖中解析出當(dāng)前需要展示的image灭美,肯定是需要耗用cpu的推溃。
小結(jié)
問(wèn)題分析也就到這里了,兩個(gè)開源庫(kù)各有特點(diǎn)届腐,具體使用哪個(gè)铁坎,需要根據(jù)不同的業(yè)務(wù)需求決定。