Как измерить время рисования UIImageView?

Я работаю над отслеживанием проблемы производительности в одном из наших приложений. Похоже, что иногда UIImageView занимает секунды, чтобы сделать изображение, и из-за способа написания кода это блокирует основной поток.

Я выяснил, что медленные изображения – это прогрессивные JPEG-файлы в разрешениях сетчатки. По какой-либо причине, когда файл достигает определенного размера, декодирование JPEG становится очень дорогостоящей операцией.

Во всяком случае, в процессе написания простого тестового приложения я понял, что не знаю, как долго длится событие ничьей. Очевидно, это блокирует основной поток, поэтому я решил просто попробовать время итерации цикла выполнения. К сожалению, это оказалось немного хаки. Вот соответствующий код:

/////////////// // // This bit is used to time the runloop. I don't know a better way to do this // but I assume there is... for now... HACK HACK HACK. :-) buttonTriggeredDate_ = [NSDate date]; [[NSRunLoop mainRunLoop] performSelector:@selector(fire:) target:self argument:[NSNumber numberWithInt:0] order:1 modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]]; /////////////// NSString* path = [[NSBundle mainBundle] pathForResource:imageName ofType:type]; self.imageView.image = [UIImage imageWithContentsOfFile:path]; 

Обратный вызов выглядит следующим образом (больше взлома!):

 - (void)fire:(NSNumber*)counter { int iterCount = [counter intValue]; NSLog(@"mark %d", iterCount); NSTimeInterval interv = [[NSDate date] timeIntervalSinceDate:buttonTriggeredDate_]; // We really need the second pass through - if it's less than X, assume // it's just that first runloop iteration before the draw happens. Just wait // for the next one. if (iterCount < 1) { iterCount++; [[NSRunLoop mainRunLoop] performSelector:@selector(fire:) target:self argument:[NSNumber numberWithInt:iterCount] order:1 modes:[NSArray arrayWithObject:NSDefaultRunLoopMode]]; } else { self.statusDisplay.text = [NSString stringWithFormat:@"%@ - Took %f Seconds", self.statusDisplay.text, interv]; } } 

Итак, мой вопрос, в основном, как вы это сделаете? Я хочу, чтобы иметь возможность заглядывать в разные изображения и запускать тест, чтобы убедиться, что у меня есть общее представление о том, сколько времени требуется для его запуска. Я также хотел бы, чтобы он был достаточно последовательным и не содержал дрожания.

Хм, может быть, мне нужно просто подклассифицировать UIImageView и записывать время вокруг [super drawRect:frame] ?

Что бы вы сделали?

Solutions Collecting From Web of "Как измерить время рисования UIImageView?"

Вероятно, вы пытаетесь найти неправильную часть проблемы. Как вы подозреваете, проблема наиболее вероятна в декоде (и, вероятно, также в распределении и копировании памяти). Маловероятно, что проблема заключается в конечном шаге «рисования» как таковом.

Это та проблема, для которой созданы инструменты. Запустите инструменты и найдите свои горячие точки.

В качестве возможного решения, если инструменты сообщают вам, что декодирование – это то, что блокирует вас, вы можете подумать об рендеринге изображений на CALayer в фоновом потоке, прежде чем помещать их в представление.