亚洲精品久久久中文字幕-亚洲精品久久片久久-亚洲精品久久青草-亚洲精品久久婷婷爱久久婷婷-亚洲精品久久午夜香蕉

您的位置:首頁技術(shù)文章
文章詳情頁

淺談IOS屏幕刷新ADisplayLink

瀏覽:6日期:2022-09-16 15:53:15
目錄什么是CADisplayLinkCADisplayLink與NSTimer有什么不同CADisplayLink使用的例子注意什么是CADisplayLink

我們在應(yīng)用中創(chuàng)建一個新的CADisplayLink對象,把它添加到一個runloop中,并給它提供一個target和selector在屏幕刷新的時候調(diào)用。

一但CADisplayLink以特定的模式注冊到runloop之后,每當(dāng)屏幕需要刷新的時候,runloop就會調(diào)用CADisplayLink綁定的target上的selector,這時target可以讀到CADisplayLink的每次調(diào)用的時間戳,用來準(zhǔn)備下一幀顯示需要的數(shù)據(jù)。例如一個視頻應(yīng)用使用時間戳來計算下一幀要顯示的視頻數(shù)據(jù)。在UI做動畫的過程中,需要通過時間戳來計算UI對象在動畫的下一幀要更新的大小等等。

在添加進(jìn)runloop的時候我們應(yīng)該選用高一些的優(yōu)先級,來保證動畫的平滑。可以設(shè)想一下,我們在動畫的過程中,runloop被添加進(jìn)來了一個高優(yōu)先級的任務(wù),那么,下一次的調(diào)用就會被暫停轉(zhuǎn)而先去執(zhí)行高優(yōu)先級的任務(wù),然后在接著執(zhí)行CADisplayLink的調(diào)用,從而造成動畫過程的卡頓,使動畫不流暢。

duration屬性提供了每幀之間的時間,也就是屏幕每次刷新之間的的時間。我們可以使用這個時間來計算出下一幀要顯示的UI的數(shù)值。但是duration只是個大概的時間,如果CPU忙于其它計算,就沒法保證以相同的頻率執(zhí)行屏幕的繪制操作,這樣會跳過幾次調(diào)用回調(diào)方法的機(jī)會。

frameInterval屬性是可讀可寫的NSInteger型值,標(biāo)識間隔多少幀調(diào)用一次selector方法,默認(rèn)值是1,即每幀都調(diào)用一次。如果每幀都調(diào)用一次的話,對于iOS設(shè)備來說那刷新頻率就是60HZ也就是每秒60次,如果將frameInterval設(shè)為2 那么就會兩幀調(diào)用一次,也就是變成了每秒刷新30次。

我們通過pause屬性開控制CADisplayLink的運(yùn)行。當(dāng)我們想結(jié)束一個CADisplayLink的時候,應(yīng)該調(diào)用-(void)invalidate從runloop中刪除并刪除之前綁定的target跟selector另外CADisplayLink不能被繼承。

CADisplayLink與NSTimer有什么不同

iOS設(shè)備的屏幕刷新頻率是固定的,CADisplayLink在正常情況下會在每次刷新結(jié)束都被調(diào)用,精確度相當(dāng)高。NSTimer的精確度就顯得低了點(diǎn),比如NSTimer的觸發(fā)時間到的時候,runloop如果在阻塞狀態(tài),觸發(fā)時間就會推遲到下一個runloop周期。并且NSTimer新增了tolerance屬性,讓用戶可以設(shè)置可以容忍的觸發(fā)的時間的延遲范圍。CADisplayLink使用場合相對專一,適合做UI的不停重繪,比如自定義動畫引擎或者視頻播放的渲染。NSTimer的使用范圍要廣泛的多,各種需要單次或者循環(huán)定時處理的任務(wù)都可以使用。在UI相關(guān)的動畫或者顯示內(nèi)容使用CADisplayLink比起用NSTimer的好處就是我們不需要在格外關(guān)心屏幕的刷新頻率了,因為它本身就是跟屏幕刷新同步的。

CADisplayLink使用的例子

self.displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(updateTextColor)];self.displayLink.paused = YES;[self.displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];-(void)updateTextColor{}- (void)startAnimation{ self.beginTime = CACurrentMediaTime(); self.displayLink.paused = NO;}- (void)stopAnimation{ self.displayLink.paused = YES; [self.displayLink invalidate]; self.displayLink = nil;}

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

注意

通常來講:iOS設(shè)備的刷新頻率事60HZ也就是每秒60次。那么每一次刷新的時間就是1/60秒 大概16.7毫秒。當(dāng)我們的frameInterval值為1的時候我們需要保證的是CADisplayLink調(diào)用的`target`的函數(shù)計算時間不應(yīng)該大于 16.7否則就會出現(xiàn)嚴(yán)重的丟幀現(xiàn)象。

在mac應(yīng)用中我們使用的不是CADisplayLink而是CVDisplayLink它是基于C接口的用起來配置有些麻煩但是用起來還是很簡單的。

以上就是淺談IOS屏幕刷新ADisplayLink的詳細(xì)內(nèi)容,更多關(guān)于IOS屏幕刷新ADisplayLink的資料請關(guān)注好吧啦網(wǎng)其它相關(guān)文章!

標(biāo)簽: IOS
相關(guān)文章:
主站蜘蛛池模板: 在线观看三级视频 | 在线观看不卡 | 999热这里只有精品 999热精品这里在线观看 | 在线精品欧美日韩 | 国产69精品久久久久9999 | 成人黄色网址 | 看一级毛片国产一级毛片 | 骚黄视频 | a级情欲片在线观看免费女中文 | 野外啪啪抽搐一进一出 | 看一级特黄a大片日本片黑人 | 国产亚洲精品久久麻豆 | 国产成人免费影片在线观看 | 精品一区二区三区高清免费观看 | 午夜激情在线观看 | 久久综合精品不卡一区二区 | 国产a一级| 精品久久免费视频 | 国产精品v在线播放观看 | 亚洲狠狠婷婷综合久久久久网站 | 国产精品免费aⅴ片在线观看 | 黄色免费小网站 | 欧美成人tv在线观看免费 | 亚洲欧美日本综合一区二区三区 | 制服丝袜日韩欧美 | 小馒头刚发育在线播放free | 免费观看在线永久免费xx视频 | 久久国产香蕉视频 | 黄色免费一级视频 | 欧美精品免费线视频观看视频 | 中文字幕 亚洲精品 | 高清国产美女在线观看 | 国产一区二区三区精品视频 | 久久亚洲人成网站 | 欧美日韩国产58香蕉在线视频 | 久久成人亚洲 | 999精品视频| 亚洲第五色综合网啪啪 | 欧美精品一区二区三区免费 | 亚洲国产日韩在线 | 日韩高清成人 |