一次运行多个CADisplayLinks?

时间:2013-02-21 15:09:25

标签: iphone ios objective-c ios6 cadisplaylink

我正在使用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;
    }

}

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

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

为什么你需要两个? CADisplayLink的目的是在每次刷新显示时触发方法。如果您希望以两种不同的速率发生两种不同的事情,那么让显示链接触发一个名为refreshView的方法:或沿着这些线的某种方式。然后在此方法中执行自定义逻辑以确定是否有时间切换选通。