iOS 直播APP送禮物 關(guān)鍵幀動畫內(nèi)存優(yōu)化

由于要在項目中優(yōu)化送禮物內(nèi)存暴漲的問題,所以在網(wǎng)上找了很多資料。最后找到一個小伙伴的,非常不錯,解決了我的問題。
借鑒這篇文章:http://www.lxweimin.com/p/4135b7de046c

UIImageView自帶的animationImages來做序列幀播放會出現(xiàn)內(nèi)存激增的情況.

1.加載圖片的方式優(yōu)化
imageNamed方法創(chuàng)建對象的步驟如下:

根據(jù)圖片文件名在緩存池中查找圖片數(shù)據(jù),如存在,則創(chuàng)建對象并返回;
如果不存在,則從bundle中加載圖片數(shù)據(jù),創(chuàng)建對象并返回;
如果相應(yīng)的圖片數(shù)據(jù)不存在,返回nil。

不緩存:imageWithContentsOfFile:
必須傳入圖片文件的全名(全路徑+文件名)。
無法加載Images.xcassets中的圖片。

大圖片最好使用imageWithContentsOfFile,內(nèi)存會釋放。

那么有什么方法可以避免呢? 可否每次播放到哪一幀時就去加載那一幀的圖片, 即每次僅加載一張圖片到內(nèi)存中. 這樣當(dāng)播放到下一張圖片時, 上一張圖片已無任何引用, 系統(tǒng)自然會對其進(jìn)行釋放.

這就是最簡單可行的一套方案. 但是我們無法靠CAAnimation及其派生類CAKeyframeAnimation來實現(xiàn)這一方案, 因為所有的圖片都會解碼導(dǎo)致占用大量的內(nèi)存.

但我們可以通過CADisplayLink來實現(xiàn)該方案, 選CADisplayLink的原因是它比NSTimer精度要高很多, 正常情況下CADisplayLink的回調(diào)會在屏幕每次刷新時觸發(fā), 即一般1/60秒觸發(fā)一次, 適合用于做UI的重繪, 因此可以通過它來周期性的替換關(guān)鍵幀圖片, 從而達(dá)到播放動畫的效果. 那么具體怎么做呢?

在CADisplayLink的回調(diào)中獲取兩次屏幕刷新的間隔時間, 通過不斷的累加間隔時間來判斷總的時間是否已經(jīng)滿足下一幀的播放時刻, 如果大于下一幀的播放時刻就可以替換為下一幀圖片了, 直至最后一張關(guān)鍵幀也播放完成.

舉個例子, 我們要在1秒內(nèi)播放完一個含有5張關(guān)鍵幀圖片的動畫, 每張圖片的停留時間、切換時間如下圖2.3.2.a所示. 所以第0秒的時候就開始展示第一張關(guān)鍵幀, 直到1.0秒這一刻時, 動畫播放結(jié)束.

此外, 如果還需要進(jìn)一步優(yōu)化, 我們可以加入圖片異步解碼、圖片預(yù)加載邏輯等方案.

  • 異步圖片解碼, 圖片解碼是一項比較耗時、比較占CPU的操作, 對于未解碼的圖片, 系統(tǒng)一般會在主線程對其進(jìn)行解碼, 所以可以通過在異步線程進(jìn)行圖片強(qiáng)制解壓縮, 從而不占用UI線程. 關(guān)于圖片解碼的詳情, 強(qiáng)烈推薦談?wù)?iOS 中圖片的解壓縮.

  • 圖片預(yù)加載, 這個就是為了進(jìn)一步節(jié)省上下文切換時間, 即前后兩張圖片切換的時間. 就是要做到當(dāng)上一幀圖片播放完時, 我們不用等下一張圖片解碼完成后再進(jìn)行圖片的切換, 而是可以直接從已解碼圖片的緩存隊列中取出直接進(jìn)行切換. 預(yù)加載我個人覺得其實主要就是閾值的最優(yōu)選擇, 可參考預(yù)加載與智能預(yù)加載一文.

上圖:
Untitled.gif

我優(yōu)化后的demo地址:https://github.com/tc1993/keyFrameAnimation

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 173,076評論 25 708
  • 內(nèi)存管理 簡述OC中內(nèi)存管理機(jī)制。與retain配對使用的方法是dealloc還是release,為什么?需要與a...
    丶逐漸閱讀 1,989評論 1 16
  • 剛剛?cè)タ戳丝闯鯌倏臻g以前給他的留言 已經(jīng)想不起來那時候的感覺了 就好像在看別人的故事 但還是能夠真真切切的感受到那...
    歸海一刀他爹閱讀 450評論 0 0
  • 荒草枯木欲重生 淚眼情深矢月明 濕了幾面 嘆了幾半 輪了幾秒 回了幾年 夢不眠 解不開 迷心戀 嗜血同盟 天人共勉...
    子棲三月寒閱讀 258評論 0 1
  • [心]我們追逐關(guān)系,追逐愛情,在最深的含義上就是:我和你的全然相遇。 下面的故事詮釋了:我全然的愛上你,最終發(fā)現(xiàn),...
    a海姑娘閱讀 358評論 0 0