Я обнаружил большую проблему с 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).
Почему? Я что-то упустил?