Пикассо не может быстро загружать изображения

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

Есть 3 ImageViews, которые отображают левое, среднее и правое изображения. При быстрой перемотке вперед/назад для заданного момента времени выбираются левый, средний и правый и отображаются в трех полях.

Вот инициализация. Кэш OkHttp составляет 100 МБ вместе с 99 МБ LruCache.

new Picasso.Builder(getApplicationContext())
                .downloader(new OkHttp3Downloader(picassoOkHttpClient))
                .memoryCache(new LruCache(99999999))
                .build();

Количество изображений, по которым перемещается окно, составляет 3000+. Поэтому я предварительно загружаю изображения как

picasso.load(imageUrl).fetch();

Средний размер изображения составляет 10 КБ — 320 x 180, поэтому он составляет 35 МБ, что меньше 99 МБ LruCache.

Когда быстрое циклическое переключение работает, многие из изображений GREEN (из MEMORY) и BLUE (из DISK), но затем, после нескольких быстрых циклов, 3 изображения зависают или становятся очень медленными. В настоящее время большинство изображений BLUE. Приложение все еще отвечает. Нет OutOfMemory или любого другого исключения.

Опция android:largeHeap также включена.

Коэффициент попаданий в статистику Пикассо очень низкий. 150/3000.

Изображения загружаются как

picasso.load(leftUrl)
.noFade()
.noPlaceholder()
.into(leftImageView);

picasso.load(middleUrl)
.noFade()
.noPlaceholder()
.into(middleImageView);

picasso.load(rightUrl)
.noFade()
.noPlaceholder()
.into(rightImageView);

Выпуск 1 -> Пикассо требуется несколько минут, чтобы загрузить более 3000 изображений. Изображения загружаются достаточно быстро на других платформах, а пропускная способность достаточна (достаточно для потоковой передачи 4K).

Выпуск 2 -> Даже после того, как Пикассо не торопится и заканчивает загрузку всех изображений, он все равно зависает. Зеленые быстрые, синие медленнее, а потом синие замирают.

PS: Я понимаю, что "раздутые" изображения будут намного больше по размеру и легко превысят пределы 99 МБ. Вот почему только некоторые из них зеленые, а большинство из них синие.


person deepSymmetry    schedule 11.05.2017    source источник


Ответы (2)


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

Picasso.with(getApplicationContext()).load(filePath).resize(400,400).centerCrop().into(imageView);

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

person Zohaib Hassan    schedule 11.05.2017
comment
На самом деле, изображения в формате JPG достаточно сжаты. Изображение 320x180 весит 10 КБ. Даже с половиной количества изображений, 1500, производительность ужасна. - person deepSymmetry; 12.05.2017
comment
Пробовал с изменением размера (320, 180), но существенной разницы нет. - person deepSymmetry; 12.05.2017
comment
Вы загружаете 3000 изображений одновременно? - person Zohaib Hassan; 12.05.2017
comment
Да. Они должны быть. Узкое место в сети может серьезно повлиять на отображение, вызывая пропуск изображений. Даже поиск на диске страдает, если Picasso просят загрузить слишком быстро. Все, что меньше 500 мс, вызывает замедление загрузки с диска (синий индикатор). - person deepSymmetry; 12.05.2017
comment
Почему бы вам не загрузить их шаг за шагом, как один за другим. В противном случае вы столкнетесь с этой проблемой. Я не знаю о ваших требованиях к проекту. Но я могу предложить загружать изображения частями, а не все вместе. Давайте загрузим первое изображение, а когда оно будет загружено, перейдем ко второму или, может быть, загрузим первые 100 изображений, а когда 100 будут загружены, перейдем к следующей сотне. Проверьте это: stackoverflow.com/questions/26548660/ В методе OnSuccess() введите условие, чтобы проверить, равна ли позиция 100 или что-то в этом роде. - person Zohaib Hassan; 14.05.2017
comment
Извините за неясность. Под загрузкой всех средств сразу я использую fetch() для их предварительной загрузки. Это распределяет загруженные изображения в памяти и дисковом кеше. Большинство на диске, а мало в памяти. Затем, когда это необходимо, доступ к изображениям осуществляется по 3 за раз, когда мы перемещаемся вперед и назад по временной шкале. - person deepSymmetry; 15.05.2017

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

Примеры:
- Glide
- UniversalImageLoader
- Fresco

person Moonbloom    schedule 11.05.2017
comment
Спасибо. Я думал об этом от отчаяния. Я просто хочу исключить любую возможность с Пикассо. Все еще бьюсь головой об него, но решения нет. - person deepSymmetry; 12.05.2017
comment
Хотя Glide не полностью решает мою проблему, он намного лучше, чем Picasso, по крайней мере, из-за используемого по умолчанию формата Bitmap. Гораздо меньше промахов, пропусков и зависаний с одинаковыми/похожими конфигурациями. Даже после того, как Picasso заставили использовать формат Glide по умолчанию, RGB_555, он по-прежнему не такой быстрый. - person deepSymmetry; 15.05.2017