iOS CADisplayLink以及和NSTimer的區(qū)別(轉(zhuǎn))

CADisplayLink是一個(gè)能讓我們以和屏幕刷新率相同的頻率將內(nèi)容畫到屏幕上的定時(shí)器寸癌。我們在應(yīng)用中創(chuàng)建一個(gè)新的 CADisplayLink 對象,把它添加到一個(gè)runloop中戚长,并給它提供一個(gè) targetselector 在屏幕刷新的時(shí)候調(diào)用。

一但 CADisplayLink 以特定的模式注冊到runloop之后,每當(dāng)屏幕需要刷新的時(shí)候,runloop就會(huì)調(diào)用CADisplayLink綁定的target上的selector圆存,這時(shí)target可以讀到 CADisplayLink 的每次調(diào)用的時(shí)間戳,用來準(zhǔn)備下一幀顯示需要的數(shù)據(jù)仇哆。例如一個(gè)視頻應(yīng)用使用時(shí)間戳來計(jì)算下一幀要顯示的視頻數(shù)據(jù)沦辙。在UI做動(dòng)畫的過程中,需要通過時(shí)間戳來計(jì)算UI對象在動(dòng)畫的下一幀要更新的大小等等讹剔。
在添加進(jìn)runloop的時(shí)候我們應(yīng)該選用高一些的優(yōu)先級(jí)油讯,來保證動(dòng)畫的平滑⊙忧罚可以設(shè)想一下陌兑,我們在動(dòng)畫的過程中,runloop被添加進(jìn)來了一個(gè)高優(yōu)先級(jí)的任務(wù)由捎,那么兔综,下一次的調(diào)用就會(huì)被暫停轉(zhuǎn)而先去執(zhí)行高優(yōu)先級(jí)的任務(wù),然后在接著執(zhí)行CADisplayLink的調(diào)用狞玛,從而造成動(dòng)畫過程的卡頓软驰,使動(dòng)畫不流暢。

duration屬性提供了每幀之間的時(shí)間心肪,也就是屏幕每次刷新之間的的時(shí)間锭亏。我們可以使用這個(gè)時(shí)間來計(jì)算出下一幀要顯示的UI的數(shù)值。但是 duration只是個(gè)大概的時(shí)間硬鞍,如果CPU忙于其它計(jì)算慧瘤,就沒法保證以相同的頻率執(zhí)行屏幕的繪制操作,這樣會(huì)跳過幾次調(diào)用回調(diào)方法的機(jī)會(huì)固该。
frameInterval屬性是可讀可寫的NSInteger型值碑隆,標(biāo)識(shí)間隔多少幀調(diào)用一次selector方法,默認(rèn)值是1蹬音,即每幀都調(diào)用一次上煤。如果每幀都調(diào)用一次的話,對于iOS設(shè)備來說那刷新頻率就是60HZ也就是每秒60次著淆,如果將 frameInterval 設(shè)為2 那么就會(huì)兩幀調(diào)用一次劫狠,也就是變成了每秒刷新30次。
我們通過pause屬性開控制CADisplayLink的運(yùn)行永部。當(dāng)我們想結(jié)束一個(gè)CADisplayLink的時(shí)候独泞,應(yīng)該調(diào)用-(void)invalidate
runloop中刪除并刪除之前綁定的 targetselector
另外CADisplayLink 不能被繼承。

CADisplayLinkNSTimer 有什么不同

iOS設(shè)備的屏幕刷新頻率是固定的苔埋,CADisplayLink在正常情況下會(huì)在每次刷新結(jié)束都被調(diào)用懦砂,精確度相當(dāng)高。
NSTimer的精確度就顯得低了點(diǎn),比如NSTimer的觸發(fā)時(shí)間到的時(shí)候荞膘,runloop如果在阻塞狀態(tài)罚随,觸發(fā)時(shí)間就會(huì)推遲到下一個(gè)runloop周期。并且 NSTimer新增了tolerance屬性羽资,讓用戶可以設(shè)置可以容忍的觸發(fā)的時(shí)間的延遲范圍淘菩。
CADisplayLink使用場合相對專一,適合做UI的不停重繪屠升,比如自定義動(dòng)畫引擎或者視頻播放的渲染潮改。NSTimer的使用范圍要廣泛的多,各種需要單次或者循環(huán)定時(shí)處理的任務(wù)都可以使用腹暖。在UI相關(guān)的動(dòng)畫或者顯示內(nèi)容使用 CADisplayLink比起用NSTimer的好處就是我們不需要在格外關(guān)心屏幕的刷新頻率了汇在,因?yàn)樗旧砭褪歉聊凰⑿峦降摹?/p>

CADisplayLink使用的例子

1.jpeg

給非UI對象添加動(dòng)畫效果

我們知道動(dòng)畫效果就是一個(gè)屬性的線性變化,比如UIView 動(dòng)畫的 EasyInEasyOut 脏答。通過數(shù)值按照不同速率的變化我們能生成更接近真實(shí)世界的動(dòng)畫效果趾疚。我們也可以利用這個(gè)特性來使一些其他屬性按照我們期望的曲線變化。比如當(dāng)播放視頻時(shí)關(guān)掉視頻的聲音我可以通過CADisplayLink來實(shí)現(xiàn)一個(gè) EasyOut的漸出效果:先快速的降低音量以蕴,在慢慢的漸變到靜音糙麦。

注意

通常來講:iOS設(shè)備的刷新頻率事60HZ也就是每秒60次。那么每一次刷新的時(shí)間就是1/60秒 大概16.7毫秒丛肮。當(dāng)我們的frameInterval值為1的時(shí)候我們需要保證的是 CADisplayLink調(diào)用的`target`的函數(shù)計(jì)算時(shí)間不應(yīng)該大于 16.7否則就會(huì)出現(xiàn)嚴(yán)重的丟幀現(xiàn)象赡磅。
在mac應(yīng)用中我們使用的不是CADisplayLink而是 CVDisplayLink它是基于C接口的用起來配置有些麻煩但是用起來還是很簡單的。

下面結(jié)合NSTimer來介紹 CADisplayLink宝与,與NSTimer不同的地方有:

1焚廊、原理不同

CADisplayLink是一個(gè)能讓我們以和屏幕刷新率同步的頻率將特定的內(nèi)容畫到屏幕上的定時(shí)器類。 CADisplayLink以特定模式注冊到runloop后习劫, 每當(dāng)屏幕顯示內(nèi)容刷新結(jié)束的時(shí)候咆瘟,runloop就會(huì)向 CADisplayLink指定的target發(fā)送一次指定的selector消息, CADisplayLink類對應(yīng)的selector就會(huì)被調(diào)用一次诽里。

NSTimer以指定的模式注冊到runloop后袒餐,每當(dāng)設(shè)定的周期時(shí)間到達(dá)后,runloop會(huì)向指定的target發(fā)送一次指定的selector消息谤狡。

2灸眼、周期設(shè)置方式不同

iOS設(shè)備的屏幕刷新頻率(FPS)是60Hz,因此CADisplayLink的selector 默認(rèn)調(diào)用周期是每秒60次墓懂,這個(gè)周期可以通過frameInterval屬性設(shè)置焰宣, CADisplayLink的selector每秒調(diào)用次數(shù)=60/ frameInterval。比如當(dāng) frameInterval設(shè)為2捕仔,每秒調(diào)用就變成30次匕积。因此盈罐, CADisplayLink 周期的設(shè)置方式略顯不便。

NSTimer的selector調(diào)用周期可以在初始化時(shí)直接設(shè)定闪唆,相對就靈活的多盅粪。

3、精確度不同

iOS設(shè)備的屏幕刷新頻率是固定的苞氮,CADisplayLink在正常情況下會(huì)在每次刷新結(jié)束都被調(diào)用,精確度相當(dāng)高瓤逼。

NSTimer的精確度就顯得低了點(diǎn)笼吟,比如NSTimer的觸發(fā)時(shí)間到的時(shí)候,runloop如果在忙于別的調(diào)用霸旗,觸發(fā)時(shí)間就會(huì)推遲到下一個(gè)runloop周期贷帮。更有甚者,在OS X v10.9以后為了盡量避免在NSTimer觸發(fā)時(shí)間到了而去中斷當(dāng)前處理的任務(wù)诱告,NSTimer新增了tolerance屬性撵枢,讓用戶可以設(shè)置可以容忍的觸發(fā)的時(shí)間范圍。

4精居、使用場合

從原理上不難看出锄禽, CADisplayLink 使用場合相對專一, 適合做界面的不停重繪靴姿,比如視頻播放的時(shí)候需要不停地獲取下一幀用于界面渲染沃但。

NSTimer的使用范圍要廣泛的多,各種需要單次或者循環(huán)定時(shí)處理的任務(wù)都可以使用佛吓。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末宵晚,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子维雇,更是在濱河造成了極大的恐慌淤刃,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,204評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件吱型,死亡現(xiàn)場離奇詭異逸贾,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)津滞,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門耕陷,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人据沈,你說我怎么就攤上這事哟沫。” “怎么了锌介?”我有些...
    開封第一講書人閱讀 164,548評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵嗜诀,是天一觀的道長猾警。 經(jīng)常有香客問我,道長隆敢,這世上最難降的妖魔是什么发皿? 我笑而不...
    開封第一講書人閱讀 58,657評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮拂蝎,結(jié)果婚禮上穴墅,老公的妹妹穿的比我還像新娘。我一直安慰自己温自,他們只是感情好玄货,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,689評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著悼泌,像睡著了一般松捉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上馆里,一...
    開封第一講書人閱讀 51,554評(píng)論 1 305
  • 那天隘世,我揣著相機(jī)與錄音,去河邊找鬼鸠踪。 笑死丙者,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的营密。 我是一名探鬼主播蔓钟,決...
    沈念sama閱讀 40,302評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼卵贱!你這毒婦竟也來了滥沫?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,216評(píng)論 0 276
  • 序言:老撾萬榮一對情侶失蹤键俱,失蹤者是張志新(化名)和其女友劉穎兰绣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體编振,經(jīng)...
    沈念sama閱讀 45,661評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡缀辩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,851評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了踪央。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片臀玄。...
    茶點(diǎn)故事閱讀 39,977評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖畅蹂,靈堂內(nèi)的尸體忽然破棺而出健无,到底是詐尸還是另有隱情,我是刑警寧澤液斜,帶...
    沈念sama閱讀 35,697評(píng)論 5 347
  • 正文 年R本政府宣布累贤,位于F島的核電站叠穆,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏臼膏。R本人自食惡果不足惜硼被,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,306評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渗磅。 院中可真熱鬧嚷硫,春花似錦、人聲如沸始鱼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽风响。三九已至嘉汰,卻和暖如春丹禀,著一層夾襖步出監(jiān)牢的瞬間状勤,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評(píng)論 1 270
  • 我被黑心中介騙來泰國打工双泪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留持搜,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,138評(píng)論 3 370
  • 正文 我出身青樓焙矛,卻偏偏與公主長得像葫盼,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子村斟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,927評(píng)論 2 355

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