iOS端lottie動畫邊框顯示異常問題記錄

一. 問題背景

UI給了一份地址欄的背景框的lottie動畫的json文件,我用版本為3.3.0lottie-ios庫的AnimationView直接加載略步,出來的lottie動畫背景框诈悍,有一段邊框會消失型宝。

    lazy var firstAnimationView: AnimationView = {
        let animation = AnimationView(name: "dest_animation")
        animation.loopMode = .loop
        animation.backgroundBehavior = .pauseAndRestore
        return animation
    }()

效果圖:

lottie_animation_border.gif

二. 問題排查

因為統(tǒng)一的lottie動畫的json文件在安卓上是顯示正常的外盯,因為lottie是三方庫惭墓,因此特意去官網(wǎng)和github查了下虹钮,lottie對安卓和iOS支持的差異聋庵,

[lottie不同平臺支持特性]

然后將lottie動畫的json一段一段分析調(diào)試也沒找到原因,后來我去github提了issues

[lottie動畫效果在iOS上面邊框顯示異常]

然后作者回復(fù)了下芙粱,說lottie3.4.0以上版本,可以直接采用Core Animation渲染引擎祭玉,能保證動畫執(zhí)行穩(wěn)定順暢。

image.png

我試了下春畔,采用了lottie3.5.0的版本脱货,采用Core Animation渲染引擎岛都,果然顯示正常:

 // MARK: - Lazy
    lazy var firstAnimationView: LottieAnimationView = {
        let animation = LottieAnimationView(name: "dest_animation")
        animation.loopMode = .loop
        animation.backgroundBehavior = .pauseAndRestore
        return animation
    }()

    lazy var secondAnimationView: LottieAnimationView = {
        let config = LottieConfiguration(renderingEngine: .coreAnimation, decodingStrategy: .codable)
        let animation = LottieAnimationView(name: "dest_animation", configuration: config)
        animation.loopMode = .loop
        animation.backgroundBehavior = .pauseAndRestore
        return animation
    }()
lottie_normal_animation.gif

從效果圖可以看出,第一個lottie動畫采用主線程的渲染引擎蹭劈,第二個lottie動畫采用了Core Animation的渲染引擎疗绣。

去官網(wǎng)查了下資料: https://github.com/airbnb/lottie-ios/discussions/1627

Lottie [3.4.0](https://github.com/airbnb/lottie-ios/releases/tag/3.4.0) is now available! This release adds a new rendering engine that uses Core Animation instead of animating on the main thread. This significantly improves animation performance while also eliminating CPU overhead.

Lottie’s original rendering engine played its animations on the app’s main thread. Once per frame, Lottie advanced the progress of the animation and re-rendered its content. This meant that:

  • Animations would consume 5-20%+ of the CPU while playing, leaving fewer CPU cycles available for the rest of the application.
  • Animations would not update when the main thread was busy, which could cause animations to drop frames or freeze entirely.

Lottie 3.4.0 includes a new rendering engine that addresses these issues and significantly improves performance. The new engine leverages Core Animation to render out-of-process with GPU hardware acceleration. Once animations begin playing, they do not consume any of the app’s CPU resources, and are effectively guaranteed to animate smoothly regardless of CPU load:

這里意思就是lottie動畫采用主線程的渲染引擎,動畫的每一幀是由主線程來更新铺韧,并提交渲染多矮,因此受限于主線程runloop是否繁忙,也使得CPU功能繁忙哈打。而lottie動畫采用Core Animation的渲染引擎塔逃,則是將動畫渲染提交到Core Animation去處理,Core Animation直接調(diào)用Gpu去渲染料仗,這個過程不受主線程runloop限制湾盗,也不占用CPU能保證動畫運行的順暢。

但同時用lottie3.5.0測試立轧,在iOS13以下的系統(tǒng)格粪,發(fā)現(xiàn)該lottie動畫竟然不顯示,斷點調(diào)試了下源碼氛改,發(fā)現(xiàn)是CGColor分類的rgb顏色方法這里有問題:

image
return CGColor(
        colorSpace: CGColorSpaceCreateDeviceRGB(),
        components: [red, green, blue])!.copy()!

這個方法默認返回的顏色的alpha0導(dǎo)致帐萎,動畫不顯示,因此對這里改動了如下:

 CGColor(
        colorSpace: CGColorSpaceCreateDeviceRGB(),
        components: [red, green, blue])!.copy(alpha: 1)!

將顏色值的透明度alpha默認設(shè)置為1胜卤。

同時也在github再次提了issues

[lottie動畫3.5.0版本在iOS13以下系統(tǒng)不顯示]

而作者也給了回復(fù)疆导,說他兩周前也發(fā)現(xiàn)這個問題,提了修復(fù)葛躏,但是還沒發(fā)新版本澈段,修復(fù)提交如下:

https://github.com/airbnb/lottie-ios/pull/1801/files#diff-a349bd038afce438fb0b070fb8054b858853b0504514df74ff72a6be8f0d6d89R9

因此作者建議我采用最新的master代碼。

三. 解決方案

最終我采用lottie3.5.0版本再加上對iOS13以下系統(tǒng)顏色修復(fù)的提交舰攒,并將lottie動畫制作為二方庫败富,而對于具體代碼修改:可以在每個動畫指定渲染引擎:

  • 單個lottie動畫指定渲染引擎
lazy var secondAnimationView: LottieAnimationView = {
        let config = LottieConfiguration(renderingEngine: .coreAnimation, decodingStrategy: .codable)
        let animation = LottieAnimationView(name: "dest_animation", configuration: config)
        animation.loopMode = .loop
        animation.backgroundBehavior = .pauseAndRestore
        return animation
    }()
  • 也可以指定全局范圍的自動選擇渲染引擎,默認優(yōu)先選擇Core Animation渲染引擎摩窃,如果Core Animation解析渲染失敗兽叮,則會調(diào)用主線程渲染引擎進行渲染
LottieConfiguration.shared.renderingEngine = .automatic
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市偶芍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌德玫,老刑警劉巖匪蟀,帶你破解...
    沈念sama閱讀 206,013評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異宰僧,居然都是意外死亡材彪,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,205評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來段化,“玉大人嘁捷,你說我怎么就攤上這事∠匝” “怎么了雄嚣?”我有些...
    開封第一講書人閱讀 152,370評論 0 342
  • 文/不壞的土叔 我叫張陵,是天一觀的道長喘蟆。 經(jīng)常有香客問我缓升,道長,這世上最難降的妖魔是什么蕴轨? 我笑而不...
    開封第一講書人閱讀 55,168評論 1 278
  • 正文 為了忘掉前任港谊,我火速辦了婚禮,結(jié)果婚禮上橙弱,老公的妹妹穿的比我還像新娘歧寺。我一直安慰自己,他們只是感情好棘脐,可當我...
    茶點故事閱讀 64,153評論 5 371
  • 文/花漫 我一把揭開白布斜筐。 她就那樣靜靜地躺著,像睡著了一般荆残。 火紅的嫁衣襯著肌膚如雪奴艾。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 48,954評論 1 283
  • 那天内斯,我揣著相機與錄音蕴潦,去河邊找鬼。 笑死俘闯,一個胖子當著我的面吹牛潭苞,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播真朗,決...
    沈念sama閱讀 38,271評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼此疹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了遮婶?” 一聲冷哼從身側(cè)響起蝗碎,我...
    開封第一講書人閱讀 36,916評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎旗扑,沒想到半個月后蹦骑,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,382評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡臀防,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,877評論 2 323
  • 正文 我和宋清朗相戀三年眠菇,在試婚紗的時候發(fā)現(xiàn)自己被綠了边败。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 37,989評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡捎废,死狀恐怖笑窜,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情登疗,我是刑警寧澤排截,帶...
    沈念sama閱讀 33,624評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站谜叹,受9級特大地震影響匾寝,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜荷腊,卻給世界環(huán)境...
    茶點故事閱讀 39,209評論 3 307
  • 文/蒙蒙 一艳悔、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧女仰,春花似錦猜年、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,199評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至一罩,卻和暖如春杨幼,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背聂渊。 一陣腳步聲響...
    開封第一講書人閱讀 31,418評論 1 260
  • 我被黑心中介騙來泰國打工差购, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人汉嗽。 一個月前我還...
    沈念sama閱讀 45,401評論 2 352
  • 正文 我出身青樓欲逃,卻偏偏與公主長得像,于是被迫代替她去往敵國和親饼暑。 傳聞我的和親對象是個殘疾皇子稳析,可洞房花燭夜當晚...
    茶點故事閱讀 42,700評論 2 345

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