1

私には最も奇妙な問題があり、なぜこれが起こっているのかわかりません。アプリがバックグラウンドで再生できるドラム マシンを実行しています。

これが私の正確なタイマーの実装です:

- (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 アプリが実行されていない場合も同じ問題が発生します。

4

1 に答える 1

0

大量の CPU を消費する無限ループを効果的に作成しました。iOS には、バッテリー寿命を最大化するためのあらゆる種類のメカニズムがあり、画面の電源がオフになったときにアクティブになる可能性があります。1 つのスレッドで 100% の CPU で効果的に回転しないように、タイマーを改善する必要があります。そこに短い期間のスリープ コールをいくつか追加して、CPU が減速できるようにします。

于 2013-06-19T22:50:25.393 に答える