Производительность навигации по нескольким полноэкранным изображениям на iPad - PullRequest
0 голосов
/ 07 сентября 2011

Мне нужно позволить пользователю перемещаться назад и вперед по разным изображениям (от 10 до 20) одним касанием.
Все изображения имеют размер 1024x768 JPG, поэтому мне не нужно изменять их размер или преобразовывать их.
Таммежду ними нет анимации (я переключу их с помощью removeFromSuperView и addSubView).
Все, что я хочу, это избегать времени загрузки или несоответствующего касания, поэтому я на самом деле думал об этих возможных решениях:* Загрузка каждого изображения по отдельности при нажатии;

Загрузка 3 изображений: предыдущего, фактического и следующего; Загрузка массива или пользовательского изображения со всеми изображениями и итерация по нему;

Я буду избегать imageNamed и буду использовать imageWithContentOfFile или imageWithData.
Какое решение, по вашему мнению, является лучшим?
Могут ли решения 1. и 3. вызвать проблемы с производительностью?

Ответы [ 3 ]

1 голос
/ 16 сентября 2011

Способ 1 будет хорош: устройства iOS могут загружать полноэкранные изображения очень быстро.Особенно, если ваши изображения не имеют альфа.Это зависит от изображений, но для классического png требуется около 0,05 секунды.Это означает, что пользователи не будут замечать время ожидания, если вам придется менять после касания, особенно если у вас был плавный переход между изображениями.

Все может стать сложнее, если пользователь сможет прокручивать изображения.В этом случае я бы посоветовал использовать UITableView.Они ведут себя как UISCrollView и загружают / выгружают страницы быстро и плавно.

Чтобы получить горизонтальное представление таблицы, вы можете использовать этот код, который отлично работает: https://github.com/alekseyn/EasyTableView

0 голосов
/ 15 сентября 2011

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

В моей реализации используется UIScrollView с подкачкой страниц.Я должен массивы, один содержит все имена изображений, а другой является изменяемым и содержит только несколько UIImageViews.Я записываю текущую «страницу», на которой включен вид прокрутки, и когда я сажусь на изображение, я проверяю, что изменяемый массив содержит это изображение и два изображения по обе стороны от него (и удаляю любые другие изображения из массива).

Проблема с этой реализацией заключается в том, что вам постоянно приходится читать образы с диска, что в основном потоке будет медленным.Ооочень, когда я первоначально создаю UIImageViews, я добавляю UIActivityIndicator к ним.Затем я передаю свой массив UIImageViews методу в фоновом режиме, который фактически загружает UIImage, а затем заставляет соответствующий UIImageView установить изображение в основном потоке следующим образом:

// called before you try to load an image in a background thread
    [imageView addObserver:self forKeyPath:@"image" options:NSKeyValueObservingOptionNew|NSKeyValueObservingOptionOld context:nil];

// called in the background thread after you load the image from disk
    [imageView performSelectorOnMainThread:@selector(setImage:) withObject:fullImage waitUntilDone:NO];`


    - (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context {
        UIImageView *imageView = (UIImageView *)object;
        [[imageView viewWithTag:1] removeFromSuperview]; // this is the activity indicator
        [imageView removeObserver:self forKeyPath:@"image"];
    }
0 голосов
/ 13 сентября 2011

Если ваш верхний предел для количества изображений равен 20, просто предварительно загрузите массив UIImages и установите свойство UIImageView.image в ответ на касание - не беспокойтесь о смене представлений, повторное использование одного UIImageView будет хорошо.

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

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

...