Skip to content

Instantly share code, notes, and snippets.

@shu223
Last active September 11, 2018 09:50
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save shu223/845f0fd9a37b6a2f9cb06973efb12449 to your computer and use it in GitHub Desktop.
Save shu223/845f0fd9a37b6a2f9cb06973efb12449 to your computer and use it in GitHub Desktop.
CADisplayLinkのメモ

##duration と timestamp

普通に初期化して、

CADisplayLink *displayLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(onTimer:)];
displayLink.frameInterval = 30;
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
self.displayLink = displayLink;
[self onTimer:self.displayLink];

こうやって link.timestamp の前回のものとの差分を取った場合、

- (void)onTimer:(CADisplayLink *)link
{
    CFTimeInterval now = link.timestamp;
    CFTimeInterval interval = now - lastTimestamp;
    lastTimestamp = now;
}

この intervallink.duration と一致する。 画面のリフレッシュレートが60fpsなので、どちらも 0.16666 近辺の値である。

しかし、次のようにフレームレートを下げた場合(この場合は2fpsになる)、

displayLink.frameInterval = 30;

link.duration は同様に 0.1666 近辺の値となるが、link.timestamp の前回との差分は0.5(60fpsで30フレームごとのfireなので2fps)近辺となる。

つまり、

  • durationframeInterval の影響を受けない・・・60fpsの場合の前回の更新時からの経過時間

ことがわかる。

##NSDefaultRunLoopMode と NSRunLoopCommonModes

どういう違いがある?

Stats, CoreImageTransition では前者を用いている

##Run Loop

[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];

と、

[displayLink addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSRunLoopCommonModes];

はどう違う?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment