Как правильно остановить и возобновить CADisplayLink?

Я обнаружил большую проблему с CADisplayLink.

У меня есть самый простой EAGLLayer с OpenGL ES 1.1, который рисует вращающийся треугольник для тестирования. Для этого нужен метод цикла выполнения, который будет вызываться с частотой обновления экрана, поэтому я запускаю цикл выполнения следующим образом:

- (void)startRunloop {
    if (!animating) {
        CADisplayLink *dl = [[UIScreen mainScreen] displayLinkWithTarget:self selector:@selector(drawFrame)];
        [dl setFrameInterval:1.0];
        [dl addToRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        self.displayLink = dl;

        animating = YES;
    }
}

- (void)stopRunloop {
    if (animating) {
        [self.displayLink invalidate];
        self.displayLink = nil;
        animating = NO;
    }
}

Когда запускается тестовое приложение, я вызываю -startRunloop. Когда я касаюсь экрана, я вызываю -stopRunloop. Когда я снова нажимаю, я вызываю -startRunloop. И так далее. Настольный теннис.

Я измеряю, как часто метод -drawFrame вызывается за 20 секунд, и NSLog его.

  • ПЕРВЫЙ цикл пуска / останова всегда выполняется на 100%. Получаю максимальную частоту кадров.

  • Все ПОСЛЕДУЮЩИЕ циклы пуска / останова показывают только около 80% производительности. Я получаю значительно меньшую частоту кадров. Но: Всегда почти одинаково, +/- 2 кадра. Без тенденции к дальнейшему ухудшению качества даже после еще 50 циклов пуска / останова.

В заключение: СОЗДАНИЕ CADisplayLink, как я делаю выше, нормально, пока он не станет недействительным или не будет приостановлен. После этого любой новый CADisplayLink больше не работает. Даже если он создан новым и точно так же, как и раньше. То же самое верно, если я приостановлю / возобновлю его, вызвав метод -setPaused: с YES / NO.

Я убедился с помощью Allocations и VM Tracker Instruments, что нет проблем с управлением памятью.Я также проверил, действительно ли вызывается метод -invalidate CADisplayLink.

iOS 4.0 на устройстве (iPhone 4).

Почему? Я что-то упустил?

13
задан dontWatchMyProfile 7 December 2011 в 02:54
поделиться