0

我使用 CADisplayLink 作为频闪计时器。

我有 2 个 CADisplayLinks:

主要的(在整个过程中运行):

SMPTELink = [CADisplayLink displayLinkWithTarget:self selector:@selector(onTick)];
SMPTELink.frameInterval = 1;
[SMPTELink addToRunLoop:[NSRunLoop mainRunLoop]
                       forMode:NSDefaultRunLoopMode];

频闪灯(仅在频闪发生时运行):

strobeLink = [CADisplayLink displayLinkWithTarget:self selector:@selector(toggleStrobe)];
strobeLink.frameInterval = 1;
[strobeLink addToRunLoop:[NSRunLoop mainRunLoop]
                     forMode:NSDefaultRunLoopMode];
[strobeLink setPaused:YES]; // I setPaused:NO when using the strobe.

一次运行两个 CADisplayLink 是不是很糟糕?有时我的闪光灯看起来并不像我认为的那样平滑。这是我的 toggleStrobe 方法:

-(void)toggleStrobe {

    if (!self.firstTimestampStrobe)
        self.firstTimestampStrobe = strobeLink.timestamp;

    NSTimeInterval elapsed = (strobeLink.timestamp - self.firstTimestampStrobe);

    NSInteger frameNumber = (NSInteger)(elapsed * ((strobeValue*15)/255)) % 2;

    if (frameNumber != self.lastFrameStrobe)
    {
        if (frameNumber == 1) {

            UIColor *color = [[UIColor alloc] initWithRed: 0 green: 0 blue: 0 alpha: 1.0];
            strobeBackground.backgroundColor = color;

        } else {

            UIColor *color = [[UIColor alloc] initWithRed: 0 green: 0 blue: 0 alpha: 0];
            strobeBackground.backgroundColor = color;

        }

        self.lastFrameStrobe = frameNumber;
    }

}
4

2 回答 2

2

显示链接的重点是能够在每次刷新屏幕时进行绘制。我不明白你为什么需要两个(因为它仍然会在显示刷新时被调用)。您不能只使用一个并在每次刷新时确定要显示的颜色吗?

于 2013-02-21T19:21:38.760 回答
0

它还不错..它只是毫无意义。

为什么需要两个?CADisplayLink 的目的是在每次刷新显示时触发一个方法。如果您希望以两种不同的速率发生两种不同的事情,那么让显示链接触发一种称为 refreshView: 的方法或类似的方法。然后在此方法中执行您的自定义逻辑以确定是否该切换频闪。

于 2013-02-21T20:30:01.737 回答