在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

您好,歡迎來電子發燒友網! ,新用戶?[免費注冊]

您的位置:電子發燒友網>源碼下載>通訊/手機編程>

iOS開發中的CADisplayLink和NSTimer詳解

大小:0.3 MB 人氣: 2017-09-25 需要積分:1

  一、什么是CADisplayLink

  簡單地說,它就是一個定時器,每隔幾毫秒刷新一次屏幕。

  CADisplayLink是一個能讓我們以和屏幕刷新率相同的頻率將內容畫到屏幕上的定時器。我們在應用中創建一個新的 CADisplayLink 對象,把它添加到一個runloop中,并給它提供一個 target 和 selector 在屏幕刷新的時候調用。

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

  在添加進runloop的時候我們應該選用高一些的優先級,來保證動畫的平滑。可以設想一下,我們在動畫的過程中,runloop被添加進來了一個高優先級的任務,那么,下一次的調用就會被暫停轉而先去執行高優先級的任務,然后在接著執行CADisplayLink的調用,從而造成動畫過程的卡頓,使動畫不流暢。

  duration屬性:提供了每幀之間的時間,也就是屏幕每次刷新之間的的時間。該屬性在target的selector被首次調用以后才會被賦值。selector的調用間隔時間計算方式是:時間=duration×frameInterval。 我們可以使用這個時間來計算出下一幀要顯示的UI的數值。但是 duration只是個大概的時間,如果CPU忙于其它計算,就沒法保證以相同的頻率執行屏幕的繪制操作,這樣會跳過幾次調用回調方法的機會。

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

  pause屬性:控制CADisplayLink的運行。當我們想結束一個CADisplayLink的時候,應該調用-(void)invalidate 從runloop中刪除并刪除之前綁定的 target 跟 selector。

  timestamp屬性: 只讀的CFTimeInterval值,表示屏幕顯示的上一幀的時間戳,這個屬性通常被target用來計算下一幀中應該顯示的內容。 打印timestamp值,其樣式類似于:179699.631584。

  另外 CADisplayLink 不能被繼承。

  給非UI對象添加動畫效果

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

  注意

  通常來講:iOS設備的刷新頻率事60HZ也就是每秒60次。那么每一次刷新的時間就是1/60秒 大概16.7毫秒。當我們的frameInterval值為1的時候我們需要保證的是 CADisplayLink調用的target的函數計算時間不應該大于 16.7否則就會出現嚴重的丟幀現象。 在mac應用中我們使用的不是CADisplayLink而是 CVDisplayLink它是基于C接口的用起來配置有些麻煩但是用起來還是很簡單的。

  二、CADisplayLink 與 NSTimer 有什么不同?

  1.原理不同

  CADisplayLink是一個能讓我們以和屏幕刷新率同步的頻率將特定的內容畫到屏幕上的定時器類。 CADisplayLink以特定模式注冊到runloop后, 每當屏幕顯示內容刷新結束的時候,runloop就會向 CADisplayLink指定的target發送一次指定的selector消息, CADisplayLink類對應的selector就會被調用一次。

  NSTimer以指定的模式注冊到runloop后,每當設定的周期時間到達后,runloop會向指定的target發送一次指定的selector消息。

  2.周期設置方式不同

  iOS設備的屏幕刷新頻率(FPS)是60Hz,因此CADisplayLink的selector 默認調用周期是每秒60次,這個周期可以通過frameInterval屬性設置, CADisplayLink的selector每秒調用次數=60/ frameInterval。比如當 frameInterval設為2,每秒調用就變成30次。因此, CADisplayLink 周期的設置方式略顯不便。

  NSTimer的selector調用周期可以在初始化時直接設定,相對就靈活的多。

  3、精確度不同

  iOS設備的屏幕刷新頻率是固定的,CADisplayLink在正常情況下會在每次刷新結束都被調用,精確度相當高。

  NSTimer的精確度就顯得低了點,比如NSTimer的觸發時間到的時候,runloop如果在阻塞狀態,觸發時間就會推遲到下一個runloop周期。并且 NSTimer新增了tolerance屬性,讓用戶可以設置可以容忍的觸發的時間的延遲范圍。

  4、使用場景

  CADisplayLink使用場合相對專一,適合做UI的不停重繪,比如自定義動畫引擎或者視頻播放的渲染。

  NSTimer的使用范圍要廣泛的多,各種需要單次或者循環定時處理的任務都可以使用。

非常好我支持^.^

(0) 0%

不好我反對

(0) 0%

      發表評論

      用戶評論
      評價:好評中評差評

      發表評論,獲取積分! 請遵守相關規定!

      ?
      主站蜘蛛池模板: 一级看片免费视频 | 久青草国产手机在线视频 | 亚洲禁片| 日本一区二区三区不卡在线视频 | 午夜一级毛片免费视频 | 国产在线播放成人免费 | 久久久99精品免费观看精品 | 欧美日韩看片 | 热re66久久精品国产99热 | 在线激情网址 | 日韩福利网站 | 全部在线播放免费毛片 | 亚洲伊人精品综合在合线 | 亚州怡红院 | 69日本xxxxxxxxx98| 欧美三级色 | 久久99久久精品97久久综合 | 人人爱干| 伊人草| 俺也去第四色 | 欧美一级特黄aaaaaa在线看首页 | 四虎国产精品永久地址51 | 午夜在线视频观看 | 国产麻豆成人传媒免费观看 | 人人干视频| 一级片在线免费播放 | 乱码中文字幕人成在线 | 美女和美女 | 天堂w | 亚洲综合一区二区 | 2017亚洲男人天堂 | 在线免费视频观看 | 性欧美成人免费观看视 | 李老汉的性生生活1全部 | 免费毛片大全 | 日本欧美一区二区三区不卡视频 | 久久999| 性欧美极品 | 热久久最新地址 | 色黄网站成年女人色毛片 | 狼人综合色|