CoreAnimation VS Facebook's Pop

一、作用對(duì)象對(duì)比


CoreAnimation 只能作用于 CALayer伦泥;而Pop Animation可以是任意基于NSObject的對(duì)象剥啤;
CALayer補(bǔ)充:結(jié)構(gòu)跟UIView的subView一樣,都是一個(gè)樹形的結(jié)構(gòu)
重繪機(jī)制:當(dāng)調(diào)用setNeedsDisplay的時(shí)候會(huì)重新調(diào)用render方法不脯,而CALayer實(shí)際是維護(hù)個(gè)三個(gè)模型的樹形結(jié)構(gòu)府怯,一個(gè)是渲染樹,一個(gè)是呈現(xiàn)樹防楷,還有一個(gè)是當(dāng)前模型樹:
  • 模型樹(Model Tree)直接創(chuàng)建的或者通過(guò)UIView獲得的(view.layer)用于顯示的圖層樹,稱之為模型樹(Model Tree);
    模型樹的背后還存在兩份圖層樹的拷貝,一個(gè)是呈現(xiàn)樹(Presentation Tree),一個(gè)是渲染樹(Render Tree).

  • 呈現(xiàn)樹(Presentation Tree),呈現(xiàn)樹可以通過(guò)普通layer(其實(shí)就是模型樹)的layer.presentationLayer獲得牺丙,模型樹則可以通過(guò)layer.modelLayer屬性獲得。當(dāng)給一個(gè)CALayer添加動(dòng)畫時(shí)复局,動(dòng)畫其實(shí)沒(méi)有改變這個(gè)layer的實(shí)際屬性冲簿,取而代之,系統(tǒng)會(huì)創(chuàng)建一個(gè)Model layer的復(fù)制品:Presentation Layer;Presentation Layer的屬性值和動(dòng)畫運(yùn)行過(guò)程中界面上看到的是一致的.Pop Animation應(yīng)用于CALayer時(shí)肖揣,在動(dòng)畫運(yùn)行的任何時(shí)刻民假,layer和其presentationLayer的相關(guān)屬性值始終保持一致浮入,而Core Animation做不到龙优。

  • 渲染樹(Render Tree),渲染樹是私有的,你無(wú)法訪問(wèn)到,渲染樹是對(duì)呈現(xiàn)樹的數(shù)據(jù)進(jìn)行渲染,為了不阻塞主線程,渲染的過(guò)程是在單獨(dú)的進(jìn)程或線程中進(jìn)行的,所以Animation的動(dòng)畫并不會(huì)阻塞主線程.

我們?cè)趯憚?dòng)畫時(shí),通常會(huì)設(shè)置 removedOnCompletion = NO;設(shè)置 fillMode 為kCAFillModeForwards事秀。這是因?yàn)橄到y(tǒng)會(huì)在duration 后自動(dòng)銷毀這個(gè) layer 的 Presentation Layer 彤断,只留下 Model Layer,不設(shè)置的話動(dòng)畫結(jié)束后會(huì)回到初始狀態(tài)。

二易迹、工作機(jī)制對(duì)比


Core Animation 工作機(jī)制
每當(dāng)我們創(chuàng)建并添加動(dòng)畫到 layer 時(shí)宰衙,QuartzCore 框架就會(huì)把動(dòng)畫的參數(shù)打包好,然后通過(guò)處理器發(fā)送給名為 backboardd 的進(jìn)程處理程序睹欲。你的應(yīng)用也會(huì)發(fā)送當(dāng)前展示在屏幕上的每一個(gè) layer 的信息供炼。
backboardd 會(huì)處理 layer 的結(jié)構(gòu)體系然后通過(guò) OpenGL 繪制出來(lái)。backboardd 使得動(dòng)畫的每一幀都可以在你的應(yīng)用中完全獨(dú)立窘疮。你的應(yīng)用完全不會(huì)參與動(dòng)畫的繪制袋哼,這些繪制完全獨(dú)立于你的應(yīng)用進(jìn)程。這意味著你可以繼續(xù)在主線程做其他事情闸衫,并且不會(huì)影響到 CAAnimation 的性能涛贯。如果阻塞了主線程,或者你在調(diào)試器中暫停了你的程序蔚出,動(dòng)畫還是會(huì)繼續(xù)執(zhí)行弟翘。
POP 工作機(jī)制
POP 本質(zhì)上是基于定時(shí)器的動(dòng)畫庫(kù)虫腋,使用每秒 60 頻率的定時(shí)器 CADisplayLink,使得動(dòng)畫刷新繪制頻率與屏幕刷新頻率一致稀余。
一旦定時(shí)器刷新悦冀,動(dòng)畫庫(kù)計(jì)算動(dòng)畫的進(jìn)程,這意味著動(dòng)畫庫(kù)會(huì)計(jì)算 layer 的屬性滚躯,如 bound雏门,opactiy,transform 等掸掏。然后動(dòng)畫庫(kù)提供最新計(jì)算的值給有動(dòng)畫的 layer (或者其他對(duì)象)茁影。最主要的區(qū)別是,layer 的狀態(tài)將會(huì)在這種情況下改變丧凤。
由于 layer 的一些參數(shù)已經(jīng)被改變募闲,應(yīng)用必須通過(guò)處理器通知 backboardd 進(jìn)程處理這些變化。當(dāng) backboardd 接收到變化通知愿待,它將在屏幕上重繪浩螺。這意味著,應(yīng)用中做的每一個(gè)動(dòng)畫幀都會(huì)傳送數(shù)據(jù)到 backboardd
由于 POP 是基于定時(shí)器定時(shí)刷新添加動(dòng)畫的原理仍侥,那么如果將動(dòng)畫庫(kù)運(yùn)行在主線程上要出,會(huì)由于線程阻塞的問(wèn)題導(dǎo)致動(dòng)畫效果出現(xiàn)卡頓、不流暢的情況农渊。更為關(guān)鍵的是患蹂,你不能將動(dòng)畫效果放在子線程,因?yàn)槟悴荒軐?duì) view 和 layer 的操作放到主線程之外砸紊。
- (void)viewDidLoad {
    [super viewDidLoad];
    CABasicAnimation *rotationAnim = [CABasicAnimation animationWithKeyPath:@"transform.rotation"];
    rotationAnim.toValue = @(M_PI);
    rotationAnim.duration = 2;
    rotationAnim.repeatCount = 20;
    [self.blueView.layer addAnimation:rotationAnim forKey:nil];
      
    POPBasicAnimation *popAnim = [POPBasicAnimation animationWithPropertyNamed:kPOPLayerRotation];
    popAnim.toValue = @(M_PI);
    popAnim.duration = 2;
    popAnim.repeatCount = 20;
    popAnim.timingFunction = [CAMediaTimingFunction functionWithName:kCAMediaTimingFunctionLinear];
    [self.yellowView.layer pop_addAnimation:popAnim forKey:nil];
    
    [self performSelector:@selector(causeMainThread) withObject:nil afterDelay:1];
}

-(void)causeMainThread
{
    // 即便線程發(fā)生死鎖传于,CoreAnimation也會(huì)繼續(xù)執(zhí)行
    dispatch_queue_t queue = dispatch_get_main_queue();
    dispatch_sync(queue, ^{
        NSLog(@"111");
    });
//    [NSThread sleepForTimeInterval:0.25];
//    [self performSelector:@selector(causeMainThread) withObject:nil afterDelay:1];
}

POP 受主線程阻塞的影響很大,因此醉顽,在使用過(guò)程中沼溜,應(yīng)避免在有可能發(fā)生主線程阻塞的情況下使用 POP ,避免制作卡頓的動(dòng)畫效果游添,產(chǎn)生不好的用戶體驗(yàn)系草。

三、使用效果對(duì)比


Pop 提供了很多類似于 CoreAnimation 的效果唆涝。在技術(shù)選擇上找都,如果只是簡(jiǎn)單的 UIView 屬性的動(dòng)畫則選擇 [UIView animationWith...];如果需要CALayer做一些比較復(fù)雜的效果,但又不想引入第三方動(dòng)畫庫(kù)石抡,在執(zhí)行效率上要求高檐嚣,則首選CoreAnimation;但如果要求展現(xiàn)一些“果凍效果”,Pop 的 POPSpringAnimation 會(huì)比CoreAnimation 在參數(shù)調(diào)整上更簡(jiǎn)便易用嚎京。
CoreAnimation 自帶的彈簧效果嗡贺,從 iOS 7 開始被廣泛應(yīng)用在系統(tǒng)動(dòng)畫中。自 iOS 8 開始鞍帝,Apple 公開了 Spring Animation 的 API诫睬,開發(fā)者也可以使用簡(jiǎn)單的代碼創(chuàng)建這類動(dòng)畫效果:
+ (void)animateWithDuration:(NSTimeInterval)duration
                      delay:(NSTimeInterval)delay
     usingSpringWithDamping:(CGFloat)dampingRatio
      initialSpringVelocity:(CGFloat)velocity
                    options:(UIViewAnimationOptions)options
                 animations:(void (^)(void))animations
                 completion:(void (^)(BOOL finished))completion
而 CASpringAnimation 是iOS9才引入的動(dòng)畫類,它繼承于CABaseAnimation
CASpringAnimation 參數(shù)說(shuō)明:
  • mass: 質(zhì)量帕涌,影響圖層運(yùn)動(dòng)時(shí)的彈簧慣性摄凡,質(zhì)量越大,彈簧拉伸和壓縮的幅度越大
  • stiffness: 剛度系數(shù)(勁度系數(shù)/彈性系數(shù))蚓曼,剛度系數(shù)越大亲澡,形變產(chǎn)生的力就越大,運(yùn)動(dòng)越快
  • damping: 阻尼系數(shù)纫版,阻止彈簧伸縮的系數(shù)床绪,阻尼系數(shù)越大,停止越快
  • initialVelocity:初始速率其弊,動(dòng)畫視圖的初始速度大小
    速率為正數(shù)時(shí)癞己,速度方向與運(yùn)動(dòng)方向一致,速率為負(fù)數(shù)時(shí)梭伐,速度方向與運(yùn)動(dòng)方向相反
  • settlingDuration: 結(jié)算時(shí)間痹雅,返回彈簧動(dòng)畫到停止時(shí)的估算時(shí)間,根據(jù)當(dāng)前的動(dòng)畫參數(shù)估算,通常彈簧動(dòng)畫的時(shí)間使用結(jié)算時(shí)間比較準(zhǔn)確
POPSpringAnimation 參數(shù)說(shuō)明:
  • springBounciness 反彈-影響動(dòng)畫作用的參數(shù)的變化幅度
  • springSpeed 速度
  • dynamicsTension 拉力-影響回彈力度以及速度
  • dynamicsFriction 摩擦力-如果開啟糊识,動(dòng)畫會(huì)不斷重復(fù)绩社,幅度逐漸削弱,直到停止技掏。
  • Mass 質(zhì)量-細(xì)微的影響動(dòng)畫的回彈力度以及速度
實(shí)現(xiàn)同樣的“果凍效果”铃将,POPSpringAnimation 甚至只設(shè)置 springBounciness 一項(xiàng)就可以展現(xiàn)非常棒的效果项鬼,而CASpringAnimation則需要調(diào)整damping哑梳,mass 等多項(xiàng)參數(shù)才能達(dá)到同樣效果。

演示&&講解部分:

DEMO1 - CA和Pop線程阻塞對(duì)比


DEMO2 - POPSpringAnimation和CASpringAnimation效果對(duì)比


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绘盟,一起剝皮案震驚了整個(gè)濱河市鸠真,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌龄毡,老刑警劉巖吠卷,帶你破解...
    沈念sama閱讀 221,548評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異沦零,居然都是意外死亡祭隔,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,497評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門路操,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)疾渴,“玉大人千贯,你說(shuō)我怎么就攤上這事「惆樱” “怎么了搔谴?”我有些...
    開封第一講書人閱讀 167,990評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)桩撮。 經(jīng)常有香客問(wèn)我敦第,道長(zhǎng),這世上最難降的妖魔是什么店量? 我笑而不...
    開封第一講書人閱讀 59,618評(píng)論 1 296
  • 正文 為了忘掉前任芜果,我火速辦了婚禮,結(jié)果婚禮上融师,老公的妹妹穿的比我還像新娘师幕。我一直安慰自己,他們只是感情好诬滩,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,618評(píng)論 6 397
  • 文/花漫 我一把揭開白布霹粥。 她就那樣靜靜地躺著,像睡著了一般疼鸟。 火紅的嫁衣襯著肌膚如雪后控。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,246評(píng)論 1 308
  • 那天空镜,我揣著相機(jī)與錄音浩淘,去河邊找鬼。 笑死吴攒,一個(gè)胖子當(dāng)著我的面吹牛张抄,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播洼怔,決...
    沈念sama閱讀 40,819評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼署惯,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了镣隶?” 一聲冷哼從身側(cè)響起极谊,我...
    開封第一講書人閱讀 39,725評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎安岂,沒(méi)想到半個(gè)月后轻猖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,268評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡域那,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,356評(píng)論 3 340
  • 正文 我和宋清朗相戀三年咙边,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,488評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡败许,死狀恐怖友瘤,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情檐束,我是刑警寧澤辫秧,帶...
    沈念sama閱讀 36,181評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站被丧,受9級(jí)特大地震影響盟戏,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜甥桂,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,862評(píng)論 3 333
  • 文/蒙蒙 一柿究、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧黄选,春花似錦蝇摸、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,331評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至民镜,卻和暖如春啡专,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背制圈。 一陣腳步聲響...
    開封第一講書人閱讀 33,445評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工们童, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人鲸鹦。 一個(gè)月前我還...
    沈念sama閱讀 48,897評(píng)論 3 376
  • 正文 我出身青樓慧库,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親馋嗜。 傳聞我的和親對(duì)象是個(gè)殘疾皇子齐板,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,500評(píng)論 2 359

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