Intereting Posts
Атрибуты свойств «nonnull» и «слабый» являются взаимоисключающими Соединение NSURL sendAsynchronousRequest Как сохранить ответ? пользовательский логин для firebase в быстрой Проблемы с подшиванием кода IOS. Как я могу стереть все и начать все заново? Синтаксис для передачи NSArray в другое приложение с настраиваемой схемой URL-адресов Как проверить дату захвата файла MOV для iPhone без копирования с Google Диска Линейный график iOS-диаграмм с тенью под линией и градиентом заполнения Параметрированные запросы SQLite в Objective-C Ошибка маршрута реквизит Как вы создаете изменчивые изображения заголовков для iOS в Photoshop? Сохранение нескольких CKRecords в одно время с помощью CloudKit и Swift Титановый файл 5.1.1.GA SDK не загружается в ios Как искать в App Store программно и возвращать информацию о приложении Как подсчитать количество изображений в папке в swift Позиционирование SKSpriteNode

Быстрый рисование изображений 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, поскольку, если я его исключил, все резко ускорится.

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

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

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

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

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