Как улучшить производительность смешивания, чтобы сделать плавную прокрутку? - PullRequest
0 голосов
/ 04 сентября 2010

Быстрое вступление

Редактировать: У меня 9 ячеек.Все 9 ячеек содержат пучок изображений.Изображения в 7 пакетах имеют некоторую прозрачность ( в файле, а не в качестве опции наложения в коде ) для загрузки изображений из Интернета под ними.Проблема с прокруткой влияет на представление таблицы, когда как пакетные, так и веб-изображения загружаются в массивы как UIImage объекты.

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

Реализация

Я использую модель, у вас есть пользовательский UITableViewCell содин пользовательский UIView, настроенный как ячейки backgroundView.

Пользовательский UIView содержит два изображения размером с ячейку ( 320x80 px ).Все элементы установлены на непрозрачный и имеют свойство 1.0 Alpha, но одно из изображений частично 100% прозрачно.

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

Ячейка initWithStyle:reuseIdentifier часть метода:

CGRect viewFrame = CGRectMake(0.0f, 0.0f, 320.0f, 80.0f);
customCellView = [[CustomCellView alloc] initWithFrame:viewFrame];
customCellView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight;
[self setBackgroundView:customCellView];

CustomCellView * Метод инициализации :

- (id)initWithFrame:(CGRect)frame {
    if ((self = [super initWithFrame:frame])) {
        self.opaque = YES;
        self.backgroundColor = [UIColor UICustomColor];
    }
    return self;
}

Изображения загружаются в NSMutableArray как объекты UIImage из файлов PNG, расположенных в Интернете ( 40 - 80 кБайт) с UIImage's imageWithData: метод ( после асинхронной загрузки).

Они устанавливаются для видимых ячеек в методе загрузки изображений и устанавливают из массива, в котором они были сохранены в в методе UITableViewDelegate tableView:cellForRowAtIndexPath: и передается через UITableViewCell с пользовательским методом в UIView.

А затем рисуется в переопределенном методе UIView drawRect::

- (void)drawRect:(CGRect)rect {
    CGRect contentRect = self.bounds; 
    if (!self.editing) {
        CGFloat boundsX = contentRect.origin.x;
        CGFloat boundsY = contentRect.origin.y;
        CGPoint point;
        point = CGPointMake(boundsX, boundsY);
        if (firstImage)  { [firstImage  drawInRect:contentRect blendMode:kCGBlendModeNormal alpha:1.0f]; }
        if (secondImage) { [secondImage drawInRect:contentRect blendMode:kCGBlendModeNormal alpha:1.0f]; }
    }
}

Как вы видите изображениярисуется с помощью метода drawInRect:blendMode:alpha:.

Проблема

Хорошо, когда на устройстве UITableView прокручивается вы можете заметить ( замечание плохо дляпользователь, очень плохой ) время простоя при каждой загрузке новой ячейки во время прокрутки.

Редактировать: Проблема скорее в смешивании, в коде вы видите, что изображение в Интернете рисуется под тем, которое уже есть в пакете - отсутствие рисования перекрывающегося изображения делает прокрутку на 70% быстрее.

Мысли

В той же реализации нет времени простоя при загрузке изображений из пакета.Должен ли я сохранять изображения в Application Sandbox, а затем использовать их оттуда.Звучит очень плохо , потому что вы должны минимизировать операции чтения-записи в приложении для мобильных устройств, потому что диск медленно умирает при каждом чтении или записи.

Редактировать: Илиможет быть, я должен хранить изображения как объекты Core Graphics?

Редактировать: Есть некоторые подсказки в этом вопросе.Но я не знаю, как эффективно сделать пользовательский рисунок.

Ответы [ 3 ]

1 голос
/ 06 сентября 2010

С http://iphoneincubator.com/blog/tag/uiimage

Как-то так, чтобы объединить два изображения. Только с 9 рядами у вас не должно быть никаких задержек.

- (UIImage *)addImage:(UIImage *)image1 toImage:(UIImage *)image2 {  
UIGraphicsBeginImageContext(image1.size);  

// Draw image1  
[image1 drawInRect:CGRectMake(0, 0, image1.size.width, image1.size.height)];  

// Draw image2  
[image2 drawInRect:CGRectMake(0, 0, image2.size.width, image2.size.height)];  

UIImage *resultingImage = UIGraphicsGetImageFromCurrentImageContext();  

UIGraphicsEndImageContext();  

return resultingImage;  
}  
1 голос
/ 05 сентября 2010

Сначала вы должны попытаться повторно использовать ячейки таблицы ... это будет иметь большое значение для использования памяти и скорости отклика ..

Для загрузки изображений из Интернета в виде таблицы, я использовал это текст ссылки решение. Он использует платформу ASIHTTPRequest для асинхронной загрузки данных и имеет настраиваемые многократно используемые ячейки.

Вы можете использовать его как есть или адаптировать его под свои нужды ... Вы можете загрузить все свои изображения асинхронно, прежде чем показывать tableView и хранить их в кэше. Используйте код, предложенный по ссылке выше, чтобы загрузить изображения из кэша, а не из Интернета. Если вы сделаете это таким образом, вы можете за один раз загрузить больше данных, чем нужно пользователю (если кто-то подключен к сети 3G и имеет ограниченный трафик, он не оценит дополнительный трафик…)

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

последнего подхода было достаточно каждый раз, когда мне нужно было загружать изображения в ячейку UITableView. Не было необходимости сохранять изображения как объекты Core Graphics.

Надеюсь, это поможет ...

Edit: другое решение для загрузки изображений с повторно используемыми ячейками в виде таблицы

0 голосов
/ 05 сентября 2010

Попробуйте создать кэш изображений, который является новым объектом obj-c, который просто возвращает UIImage, который вам нужен, сохраняя до 50 или около того запрошенных UIImage под рукой. Затем ячейка отправляется на рисование, она просто запрашивает объект кэша для изображения - и либо сразу получает его, либо объект кэша начинает загружать его.

UImage* theImage = [myImageCache imageForURL:urlForPNGImage]; 
[theImage drawinRect:rectForImageInCell];

// imageCache имеет словарь UIImages с изображением, сохраненным с URL в качестве ключа. Вам также нужно отслеживать такие вещи, как время последнего использования и т. Д., Чтобы вы могли держать память под контролем.

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

for (rows unseenButNearTheView)
 urlForRow = blah
 [myImageCache imageForURL:urlForRow]; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...