2012-02-05 2 views
2

Я пытаюсь выполнить небольшой фрагмент кода на каждом отдельном фрейме в обычном (не OpenGL) приложении iPhone. Цель состоит в том, чтобы иметь счетчик кадров, чтобы я мог измерять (а не угадывать), где медленные точки в приложении, и исправить их, чтобы создать лучший пользовательский интерфейс.CADisplayLink с NSRunLoopCommonModes не выполняется для каждого кадра при отслеживании UIScrollView?

Что я сделал до сих пор зарегистрировать CADisplayLink для всех режимов (включая отслеживание):

CADisplayLink *displayLink = [[CADisplayLink displayLinkWithTarget:self selector:@selector(frame)] retain]; 
[displayLink addToRunLoop:[NSRunLoop mainRunLoop] forMode:NSRunLoopCommonModes]; 

код, который выполняется, выглядит следующим образом (lastDraw является NSDate * и сосчитать Int):

- (void) frame { 
NSDate *newDate = [NSDate date]; 

if([newDate timeIntervalSinceDate:lastDraw] >= 1) { 
    label.text = [NSString stringWithFormat:@"%d FPS", count]; 

    count = 0; 
    [lastDraw release]; 
    lastDraw = [newDate retain]; 
} 

count++; 
} 

Идея здесь состоит в том, чтобы каждые несколько секунд получать обновление относительно того, сколько кадров было нарисовано за последнюю секунду.

Это похоже на работу в порядке, но при прокрутке в UIScrollView цифры явно не отображаются: если я просто прокручиваю, как обычный человек, то частота кадров, похоже, имеет смысл. Однако, если я прокручиваю громко вверх и вниз, тогда отображаемая скорость опускается до 1 или 2 кадра в секунду, но ясно, что нарисовано больше кадров, чем один раз в секунду.

Когда я изменить метод кадров, как например:

- (void) frame { 
    label.text = [NSString stringWithFormat:@"%f", displayLink.timestamp]; 
} 

Становится очевидным, что очень немногие события запускаются, когда я прокручиваю.

Я прочитал много статей здесь и вокруг Интернета, которые касаются UIScrollViews и NSRunLoopCommonModes vs NSDefaultRunLoopMode, но не нашли кого-то, описывающего мою проблему. Ближайший я нашел в этом question

Помните, что если CADisplayLink не может стрелять для обновления экрана (в связи с основным потоком будучи заняты такими вещи, как рисование предыдущего кадра), то он может пропустить ее, как у него не будет достаточно времени для завершения.

Я не могу найти никаких доказательств, что в официальном documentation, хотя, и надеюсь, что я делаю что-то неправильно ...

Если это делает никакой разницы устройство в вопросе работает iOS 4.3.3.

+0

Что произойдет, если вы добавите ссылку на изображение в 'UITrackingRunLoopMode' в дополнение к' NSRunLoopCommonModes'? –

+0

Спасибо за предложение, к сожалению, это не помогло:/ '[displayLink addToRunLoop: [NSRunLoop mainRunLoop] forMode: NSRunLoopCommonModes]; [displayLink addToRunLoop: [NSRunLoop mainRunLoop] forMode: UITrackingRunLoopMode]; ' –

ответ

1

Я подтвердил это с помощью Apple в билете № 10848893 по адресу http://bugreport.apple.com/, и кажется, что это ошибка, которая была исправлена ​​в iOS 5.1 seed 3, где я неспособен воспроизвести проблему.