jarinosuke blog

about software engineering, mostly about iOS

CADisplayLink について

ユースケース

CADisplayLink を実際に使う例と共にどんなクラスなのか簡単に紹介します。

例えば現在時刻を表示する場合。

画面に表示されている日時を定期的に更新する必要があります。

そのような場合に NSTimer で 0.01 秒など適当なインターバルを設定して更新、みたいなこと実装した経験ありませんか?

僕はあります。

それを解決するための表示されているビューを更新するためのイベントを取得するためのクラス、それが CADisplayLink です。

最近 facebookOSS 化した pop や、長年 iOS の 2D ゲームフレームワークとして親しまれている cocos2d でも、もちろん使われていました。

facebook/pop

cocos2d/cocos2d-iphone

CADisplayLink の使い方

CADisplayLink を以下の様にしてセットアップすることで、ディスプレイの更新タイミングをトリガーにしたイベント実行が可能になります。

///1
CADisplayLink *link = [CADisplayLink displayLinkWithTarget:self selector:@selector(update:)];


///2
[link addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

画面更新には CADisplayLink

前述したバッドケースとして NSTimer で更新、というのがありました。

これの何が悪いかというと、メインスレッドのロックなどが無ければ、画面の更新は大抵の場合 1/60 秒間隔で行われます。

なので、NSTimer でそれより細かい間隔で更新してもディスプレイには反映されません。

また画面の更新間隔はメインスレッドの具合によって変動するので、 CADisplayLink を用いて画面と関連づけて更新した方が良いというわけです。

ちなみに Building Paper を見て初めて知りましたが、大体メインスレッドで5ms以上処理がかかると、ドロップフレームが起こるらしいです。

facebookの”Building Paper”はすべてのiOSエンジニアがみるべき

CADisplayLink の考え方としてはゲーム開発などのフレームワークなどに良くある update 関数と近いというか同じだと思います。

画面上に描画する処理をユーザからの入力や、システム内のループで行っているものを CADisplayLink に置き換える事でアプリケーションをヌルヌル動かす事ができるようになるかもしれません。

アップル Apple Mini DisplayPort-Dual-Link DVIアダプタ MB571Z/A

アップル Apple Mini DisplayPort-Dual-Link DVIアダプタ MB571Z/A