一.序列幀優(yōu)缺點
優(yōu)點:可以幫助我們簡單輕松實現(xiàn)一些比較復雜的動畫效果,只需讓UI給圖就可以
缺點:為了播放效果及連貫速度,圖片數(shù)量可能會比較多
占用內(nèi)存峰值較大
圖片比較常見的加載方式:
1.imageNamed
使用過的圖片緩存在內(nèi)存里,不會主動釋放,除非遇到內(nèi)存警告,當圖片多時,內(nèi)存占用較大
2.imageWithContentsOfFile
使用的圖片直接從磁盤解碼,使用過后立即釋放,下次使用的時候重新解碼,磁盤IO開銷會較大
二.相關資料
騰訊序列幀優(yōu)化:https://dev.qq.com/topic/57fc8cea302e4725036142f6
上面講的非常好,也分析了很多優(yōu)化空間,針對我們自己項目的實際情況,我著重優(yōu)化的是使用大尺寸圖片做序列幀時的內(nèi)存峰值
三.內(nèi)存峰值
我們有一個全屏序列幀,尺寸是750*1334 px 40多張圖
用系統(tǒng)的方法實現(xiàn)如下
animationImageView.animationImages = @[..........]; //假設40多張
animationImageView.animationDuration = 2.0f;
animationImageView.animationRepeatCount = 1;
因為是全屏圖,一張750*1334 的圖,加載到內(nèi)存里大概3-4MB,如果40多張全緩存內(nèi)存,就會造成120-160MB的常駐內(nèi)存,所以不能采用imageNamed
的方式,只能用imageWithContentsOfFile
但是即便用imageWithContentsOfFile
配合系統(tǒng)方法animationImages
,也不能避免內(nèi)存峰值,因為傳給animationImages
的圖片數(shù)組里面包含了一次性解碼出來的40多張圖
四.解決辦法
使用一張圖片解碼一張圖片,使用完畢后釋放一張圖片
每兩張圖片之間的間隔可以用一些停頓方法來操作
只要保證了每張圖片之間的幀間隔以及播放順序,播放次數(shù),就能實現(xiàn)和系統(tǒng)一樣的效果