Intereting Posts
Переключение переключателя контроллера Push View не включает панель навигации Как получить точную синхронизацию часов при выполнении сверстников с помощью GKSession? Ajax на Captive Network Assistant на iOS и OSX Петля между двумя NSDates в Objective C Контролировать, кто использует корпоративное приложение iOS, используя профиль распределения ресурсов предприятия? Обнаруживать только поворотный жест справа налево Поверните CMSampleBuffer произвольным углом и добавьте в AVAssetWriterInput в swift 3 Использовать изображение для backBarButtonItem без NO TEXT Ошибка SDK для Facebook в приложении IOS Лучший способ реализовать многопоточность Файл заголовка C ++ в CocoaPod не может импортироваться из фреймворка Как правильно использовать фреймворк Photos в iOS 8 с UICollectionView, сохраняя пропорции изображения, например, в Messages.app? Как просмотреть причину сбоя в iTunes Connect? Mocking CKContainer для модульного тестирования Точка внутри повернутого CGRect

Быстрый рисование изображений UIImage на UIView

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

-(void)drawObjects:(NSArray*)objects withImages:(NSDictionary*)images <etc> { // Get graphic context and save it CGContextRef context = UIGraphicsGetCurrentContext(); CGContextSaveGState(context); // Display objects in reverse order for (int i = [objects count] - 1; i >= 0; i--) { MyObject *object = [objects objectAtIndex:i]; // Check if object shall be visible if (<test to check whether the image shall be visible or not>) { // Get object image UIImage* image = <retrieve image from "images", based on a key stored in "object">; // Draw image float x = <calculate image destination x>; float y = <calculate image destination y>; float imageWidth = <calculate image destination width>; float imageHeight = <calculate image destination height>; CGRect imageRect = CGRectMake(x - imageWidth / 2, y - imageHeight / 2, imageWidth, imageHeight); [image drawInRect:imageRect]; } } // Restore graphic context CGContextRestoreGState(context); } 

Моя проблема в том, что этот код медленный; для выполнения цикла требуется около 700-800 мс, когда количество изображений составляет около 15 (iPhone 4, iOS 4.3.5). Я немного экспериментировал, и кажется, что узким местом является вызов drawInRect, поскольку, если я его исключил, все резко ускорится.

Кто-нибудь предлагает предложения?

Solutions Collecting From Web of "Быстрый рисование изображений UIImage на UIView"

Проблема в том, что вы на самом деле рисуете (создаете представление экрана) изображение в каждом кадре, потому что drawInRect: не имеет понятия, что вы хотите повторно использовать изображение, которое вы отображали в последнем кадре. Но вам это не нужно. Вы хотите только нарисовать его один раз, а затем преобразовать его, чтобы изменить его положение и размер.

UIKit делает это легко для вас: просто установите кадр для UIImageView , и изображение будет отображаться там, где и насколько оно вам нужно, без необходимости повторной визуализации данных изображения.

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

Ваш номер один ответ: запустите Инструменты и посмотрите, какая часть этого на самом деле занимает время. (Да, скорее всего, это drawInRect: но это может быть «получить изображение», которое вы не показывали).