【问题标题】:Running multiple CADisplayLinks at a time ?一次运行多个 CADisplayLinks ?
【发布时间】:2013-02-21 15:09:25
【问题描述】:

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

我有 2 个 CADisplayLink:

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

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;
    }

}

【问题讨论】:

    标签: iphone ios objective-c ios6 cadisplaylink


    【解决方案1】:

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

    【讨论】:

    • 确实想出了一种方法将它整合到一个 CADisplayLink 中 - 效果很好!
    • 从 API 的角度来看,不通过检查其他人是否已经存在来增加复杂性是有意义的。
    • 这是世界上最明显的事情,你会有两个、三个或 几十个 使用帧循环的概念。说“为什么要使用多个 CADisplaylnk 回调”就像是在说“为什么在一个类中有多个函数,只需将它们全部放在一个中。”
    【解决方案2】:

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

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

    【讨论】:

    • 从 API 的角度来看,不通过检查其他人是否已经存在来增加复杂性是有意义的。
    猜你喜欢
    • 2013-11-21
    • 2017-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-25
    • 2015-02-06
    • 2019-04-06
    相关资源
    最近更新 更多