В приложении у меня есть UICollectionView
с размером элемента, так что на экране одновременно видно около 20 элементов. Контент, который я хочу отображать в каждой ячейке, представляет собой изображение Gif, загруженное с Giphy / Tenor.
Однако я понял, что gif-файлы занимают гораздо больше места (и времени для загрузки), чем относительные mp4-файлы, которые Tenor и Giphy предоставляют для каждого анимированного изображения, что на самом деле очевидно, поскольку формат файла mp4 имеет логику сжатия и вроде того. Извините, если я использую неправильные термины.
Чтобы список загружался быстрее, я решил переключиться, используя UIImageView
с изображениями GIF на AVPlayerLayer
, потому что файл mp4 примерно в 10 раз легче, чем изображение GIF. Но я столкнулся с проблемой производительности, аналогичной описанной ЗДЕСЬ . Поток в основном такой же, у меня более 20 элементов, видимых одновременно, но из-за аппаратных ограничений он показывает только 16 видео. Я не смог найти обходного пути или каких-либо других фреймворков, которые позволили бы иметь более 16 AVPlayerLayer
, показывающих видео одновременно.
Мне интересно как WhatsApp приложение работает и обрабатывает эту логику. Он также имеет выбор GIF от Тенора. Я уже проверил и выяснил, что WhatsApp загружает небольшие видеофайлы, а не изображения GIF. Вот почему он загружается очень быстро. Но я понятия не имею, как они могут показывать более 20 предметов одновременно. Вот как это работает в WhatsApp - https://media.giphy.com/media/33E84h3RAVn0vQWZak/giphy.gif. Кроме того, я замечаю, что во время прокрутки отображаются небольшие статические предварительные просмотры, но я не вижу, чтобы приложение делало для этого запросы. Вероятно, они получают первый кадр GIF на лету без каких-либо задержек в основной теме.
Я тоже пытался это сделать, но даже если я делаю каждый отдельный материал в фоновом потоке, а единственная строка в основном потоке - "self.imageView.image = myImage", это все равно немного затягивает, если у меня есть 8 элементов например, в строке и очень быстро прокручивают.
Я вижу только 2 возможных решения, чтобы он загружался быстро (поэтому нам определенно нужно загружать mp4 вместо gif-файлов) и плавно прокручивать без багов:
1. WhatsApp использует свое собственное ядро Video для отображения видео в UICollectionViewCell.
2. WhatsApp загружает видео, чтобы ускорить процесс загрузки, но затем кодирует файл mp4 в gif-файл на лету и использует обычный анимированный UIImageView для отображения выходного gif-файла. Однако я не смог заставить этот поток работать очень быстро без затягивания во время «массивной» прокрутки
Есть мысли о том, как реализовать то же самое, чтобы он работал быстро и гладко, как в WhatsApp? Я не могу проверить, как он обрабатывает загруженную информацию, но наверняка он загружает файлы mp4, а не гифки.