iPhone屏幕关闭时的方法执行延迟

时间:2013-06-19 22:42:57

标签: ios background nsthread latency

我有一个最奇怪的问题,我不知道为什么会这样。我正在运行一台能够在应用程序处于后台时播放的鼓机。

这是我精确的计时器实现:

- (void)run
{
    uint64_t interval = [self computeInterval];
    mach_timebase_info_data_t info;
    mach_timebase_info(&info);

    uint64_t currentTime = mach_absolute_time();

    currentTime *= info.numer;
    currentTime /= info.denom;

    uint64_t nextTime = currentTime;

    dispatch_queue_t mainQueue = dispatch_get_main_queue();

    while (_running) {
        if (currentTime >= nextTime) {

            dispatch_async(mainQueue, ^{

                [_delegate accurateTimerDidTick:self];

            });

            interval = [self computeInterval];
            nextTime += interval;
        }

        currentTime = mach_absolute_time();
        currentTime *= info.numer;
        currentTime /= info.denom;
    }
}

我用

开始
- (void)start
{
    self.running = YES;

    [NSThread detachNewThreadSelector:@selector(run) toTarget:self withObject:nil];
}

当应用程序进入后台时,它可以完美运行,或者至少与应用程序处于活动状态时相同。即使屏幕锁定,它也能正常工作,但是当屏幕熄灭时,它会开始窒息或减速。因此,无论应用状态如何,当屏幕关闭或打开时,性能的唯一差异是显而易见的。

任何想法为什么会发生这种情况将不胜感激!

非常感谢你。

更新1: 令人难以置信的事情:我开始检查与Audiobus应用程序的集成,他们推荐的第一个测试是运行应用程序,而Audiobus也在运行,看看是否有任何故障或延迟声音。猜猜看 - 它现在完美无缺!屏幕开/关没有任何区别。我不确定这是否真的好,因为现在我更加困惑了。当然,当Audiobus应用程序没有运行时,同样的问题也会恢复。

1 个答案:

答案 0 :(得分:0)

你已经有效地制造了一个耗费大量CPU的无限循环。 iOS具有各种机制,可以最大限度地延长电池寿命,这些机制可能会在屏幕关闭时激活。您需要改进计时器,以便在1个线程上无法有效地在100%CPU上旋转。在那里添加一些小持续时间的睡眠呼叫,以便CPU可以减速。